介绍:
查找数据表中的行的两种方式,不管聚集索引,还是非聚集索引,都是用B+树来实现的,关于B树的介绍http://blog.csdn.net/p424671075/article/details/6907598
Clustered Index(聚集索引):类似于使用字典的拼音索引来找字
表必须按顺序排列,聚集索引的叶节点就是实际的数据页,每一页为一个页节点,存取数据时表得保持顺序故会减低速度,每个表只能有一个聚集索引,聚集索引的平均大小大约为表大小的5%左右,查询速度快,修改速度慢(为保持索引与数据顺序一致)
下图为执行:select * from table where firstName = 'Ota'的过程
从根节点root开始,找到下一个节点的指针page145,在节点page145再找到下一个节点的指针Page120,到达叶子节点(必须到达叶子节点),数据必定在这里,如果不在那么该表中就没有该数据
关于sysindexes http://technet.microsoft.com/zh-cn/library/ms190283.aspx sysindexes 为一张表在数据库(每个数据库一张)中为每个索引与表生成一行,该行的值表示该表或索引的属性
indid表示:索引 ID:
0 = 堆
1 = 聚集索引
> 1 = 非聚集索引
Nonclustered Index(非聚集索引):类似于使用字典的“部首目录”和“检字表”来找字
与聚集索相比只是多了一张地址表(必须的两列:一列记录关键码即要查找的关键字,第二列记录该关键字在原表中的位置地址),该地址表必须安顺序排列,下图的leaf level 即为地址表,heap为原表
下图为执行:select * from table where firstName = 'Matey' or firstName = 'Ota' or firstName = 'Phua' or firstName = 'Rudd' 的过程
上部分过程一样只是到了叶子节点后还继续,根据表中的地址访问其在原表中的位置
补充:
http://www.cnblogs.com/aspnethot/articles/1504082.html (聚集索引和非聚集索引(整理))
http://www.cnblogs.com/Arlen/articles/1751312.html (聚集索引和非聚集索引以及查询数据的过程 finding rows in a clustered index )
http://technet.microsoft.com/zh-cn/library/ms177443.aspx (聚焦索引结构)
http://msdn.microsoft.com/zh-cn/library/ms177484.aspx (非聚焦索引结构)
http://baike.baidu.com/view/692530.htm (百度百科 聚焦索引)
使用场合:
聚集索引:
对于那些经常要搜索范围值的列特别有效
查找特定的行也很有效率
含有大量非重复值的列。
使用BETWEEN,>,>=,<或<=返回一个范围值的列
被连续访问的列
返回大型结果集的查询
经常被使用连接或GROUP BY子句的查询访问的列
下面的表总结了何时使用聚集索引或非聚集索引(很重要):
动作描述 | 使用聚集索引 | 使用非聚集索引 |
列经常被分组排序 | 应 | 应 |
返回某范围内的数据 | 应 | 不应 |
一个或极少不同值 | 不应 | 不应 |
小数目的不同值 | 应 | 不应 |
大数目的不同值 | 不应 | 应 |
频繁更新的列 | 不应 | 应 |
外键列 | 应 | 应 |
主键列 | 应 | 应 |
频繁修改索引列 | 不应 | 应 |