您的位置:首页 > 职场人生

年终总结之搜房网面试题(三)

2015-01-13 08:06 197 查看
昨天停滞了一天,还是寒假到了懒散了啊,这是不行滴,踏踏实实做好自己的日常工作,是十分重要,不然怎么拼命考研,拼命学技术,恩,突然灵光一闪,要是把从现在一直到考研的经历写成博客是不是也不错呢?嘿嘿嘿,啊哈哈哈啊哈。。。

咳咳,说正题,开始第三题:

【3】对于1000万数据量的表来说,对于唯一的ID列创建索引与不创建索引,查询速度有多大区别?

好吧,我承认我很low,从最基础的来吧。

a. 什么是索引?

索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。

建立索引的目的是加快对表中记录的查找或排序。为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。数据库索引就是为了提高表的搜索效率而对某些字段中的值建立的目录


因为,增加索引也有许多不利的方面。第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

b.如何创建索引?

首先建立一个表

CREATE TABLE mytable(
idserial primary key,
category_id int not null default0,
user_id int not null default0,
adddate int not null default0
);
建立一个简单的索引

CREATE INDEX mytable_categoryid ON mytable (category_id);
建立一个多重索引

CREATE INDEX mytable_categoryid_userid ON mytable(category_id,user_id);


c.百万数量级的表的查询数据

由于网上的前辈们说了,千万级的数据小笔记本承受不起,所以我也从百万级的开始吧,如果顺利的话我也会试试千万级别的。

构造测试数据

create table myTestTable as
select rownum as id,
to_char(sysdate + rownum/24/3600, 'yyyy-mm-dd hh24:mi:ss') as
inc_datetime,
trunc(dbms_random.value(0, 100)) as random_id,
dbms_random.string('x', 20) random_string
from dual
connect by level <= 1000000;
--myTestTableTest
create table myTestTableTest as
select rownum as id,
<pre name="code" class="sql">     to_char(sysdate + rownum/24/3600, 'yyyy-mm-dd hh24:mi:ss') as
inc_datetime,
trunc(dbms_random.value(0, 100)) as random_id,
<pre name="code" class="sql">     dbms_random.string('x', 20) random_string


from dual

connect by level <= 1000000;



好吧,这是oracle中的语法和方法,前辈们写的代码真是让人欲仙欲死,创建表的解释如下:

create table as 是复制相同的表结构,as创建出来的表缺少原表的索引信息,只有表的结构相同,没有索引。

to_char()函数:将数值型或者日期型转化成字符型。

sysdate函数,oracle获取当前时间,

trunc()函数:截取日期或数字,返回指定的数值。

rownum:是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。

dbms_random.string(选项,返回字符串长度):用于产生随机字符串。 dual:oracle提供的最小的表,不论进行何种操作(不要删除记录),它都只有一条记录——'X'。

用途:1、select计算常量表达式,伪列等值;

2、查看当前用户;

3、用作计算器;

4、调用系统函数;

5、查看序列值。

connect by level 实现连续数字的插入。

以上代码是oracle中最常用的快速构建大数量级表结构的语法,很重要,不懂也得背下。。。。

为myTestTable表创建索引:

create index sy001 on myTestTable(ID);
测试SQL如下:

SELECT * FROM myTestTableTest  WHERE  ID='10000';
SELECT * FROM myTestTable  WHERE  ID='10000';
测试所用的时间:未用索引10.671秒,用索引0.047秒

疑问?:oracle里是怎么看到数据搜索时间的?或者所有的数据库能够自动看到搜索所需时间么?(我记得有些数据库图形化窗口可以,那么程序可以么?)

SELECT * FROM myTestTableTest  WHERE  random_string='R5XLUNRTKUTE1IZT5R';
SELECT * FROM myTestTable  WHERE  random_string='R5XLUNRTKU5YTE1IZT5R';


所用时间:未用索引9.532秒,用索引8.362秒。

由以上结果可知:

对于创建了索引的ID来说,查询速度的提升还是相当明显的,但对于非索引的查询来说,提升不是很明显,当数据量增大时,之间的差距也会增大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: