1. 什么是聚集索引?什么是非聚集索引?索引的作用是什么?请说明上述实验题1的验证过程及所得到的结果?
首先要回答问题,什么是索引?
网上定义如下:索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,索引提供指向存储在表的指定列中的数据值的指针,然后根据管理员指定的排序顺序对这些指针排序。在数据库中,索引使数据库程序无须对整个表进行扫描,直接使用索引来找到特定值,然后顺指针找到包含该值的行。
什么是聚集索引?
聚集索引确定表中数据的物理顺序,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。
具有唯一性。聚集索引类似于电话簿,通过姓氏来决定排序。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。就好像电话簿的排序,要么由姓氏来排序,要么由号码来排序等等,产生的排序顺序都是唯一的。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
检索效率比非聚集索引高,但对数据更新影响较大。
如果将索引的存储结构看成一棵树,聚集索引的叶节点就是数据节点。(也就可以直接决定表中相应行的物理顺序)
什么是非聚集索引?
非聚集索引并不能确定表中数据的物理顺序。
并不是唯一的。非聚集索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常用的每个列创建一个非聚集索引。
比如一本字典,包括了多种索引,其中有提供部首以及笔画的索引,这样就可以方便读者查询不认识的字。但字典的字本身另一种顺序(读音)来排序。
非聚集索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。(所以并不能直接决定物理顺序)
索引的作用?
1.通过创建唯一索引,可以保证数据记录的唯一性。(可以通过聚集索引来实现)
2.可以大大加快数据检索速度。(这个在后续实验中会进行测试)
3.可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。什么意思呢?比如两张表之间的联结,S.xh=E.xh,是采用笛卡尔积的形式实现的。也就是取左边的每一行和右边的每一行进行比较,如果相等则返回true。但如果创建了索引,就不用遍历左表和右表,可以直接根据索引来找到。这样就加速了表与表之间的连接。
4.在使用ORDER BY和GROUP BY子句中进行检索数据时,可以显著减少查询中分组和排序的时间。也就是说,可以根据相应的索引快速进行排序和分组。
实验内容:验证在1000万个以上记录时在索引和不索引时的查询时间区别。
由于本人电脑原因,光是创建100W条记录就要花费接近20分钟,实在没办法,只能创建120W条记录来进行实验,创建的语句如下:
use school
create table Table_1
(number int NOT NULL);
declare @i int set @i=1 while @i<300000 begin
insert into Table_1 values(@i) set @i=@i+1 end
set @i=1 while @i<300000 begin
insert into Table_1 values(@i) set @i=@i+1 end
set @i=1 while @i<300000 begin
insert into Table_1 values(@i) set @i=@i+1 end
set @i=1 while @i<300000