什么是索引呢?
打个比方,你有很多的小抽屉,每个抽屉里面放一些杂物,假如你要找东西,最原始的方法就是一个个抽屉翻,这就是没有索引的情况。
假如聪明一点,给抽屉编号(唯一键),把哪个号码的抽屉有什么东西记录在纸上,找东西先看看这张纸,这就是普通索引,假如你要知道哪个抽屉有什么,你可以在纸上迅速找到抽屉号码(大家知道这是使用查找树),然后得到相关的信息,这种情况普通索引是很快的;但是要找到一个特定的东西哪些抽屉有,你就要把整张纸遍历一次,这就是LIKE查询,假如你要找哪些抽屉同时有两种甚至更多种物品,LIKE就更加烦琐了。假如一个表有上千万的记录,大家可以想象查询的代价。
在索引中又分为聚集索引和非聚集索引两种索引模式。
1)聚集索引
表中存储的数据按照索引的顺序存储,检索效率比普通索引高,索引占用硬盘存储空间小(1%左右),但对数据新增/修改/删除的速度影响比较大(降低)。
如下。
● 无索引,数据无序。
● 有索引,数据与索引同序。
● 数据会根据索引键的顺序重新排列数据。
● 一个表只能有一个索引。
● 叶节点的指针指向的数据也在同一位置存储。
TSQL语法:create CLUSTERED INDEX idxempID ON emp(empID)
2)非聚集索引
不影响表中的数据存储顺序,检索效率比聚集索引低,索引占用硬盘存储空间大(30%~40%),对数据新增/修改/删除的影响很少。特点如下。
● 一个表可以最多可以创建249个非聚集索引。
● 先建聚集索引才能创建非聚集索引。
● 非聚集索引数据与索引不同序。
● 数据与非聚集索引在不同位置。
● 非聚集索引在叶节点上存储,在叶节点上有一个“指针”直接指向要查询的数据区域。
● 数据不会根据非聚集索引键的顺序重新排列数据。
TSQL语法:create NONCLUSTERED INDEX idximpID ON emp(empID)
对于索引有一些错误观点,具体如下。
● 主键就是聚集索引。
● 只要建立索引就能显著提高查询速度。
● 把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度。
一般来说以下规则是正确的:
● 用聚集索引比用非聚集索引的主键速度快。
● 用聚集索引比用一般的主键做order by时速度快,特别是在小数据量情况下。
● 使用聚集索引内的时间段,搜索时间会按数据占整个数据表的百分比成比例减少,而无论聚集索引使用了多少个。
● “水可载舟,亦可覆舟”,索引也一样,不要过度使用索引。