聚集索引与非聚集索引 - SQL

介绍:
查找数据表中的行的两种方式,不管聚集索引,还是非聚集索引,都是用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子句的查询访问的列

下面的表总结了何时使用聚集索引或非聚集索引(很重要):

动作描述使用聚集索引使用非聚集索引
列经常被分组排序
返回某范围内的数据不应
一个或极少不同值不应不应
小数目的不同值不应
大数目的不同值不应
频繁更新的列不应
外键列
主键列
频繁修改索引列不应
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值