日期:2014-05-19  浏览次数:20457 次

请教关于“主键”和“聚集索引”
今天看到篇文章,里面有个表格:
  -----------------------------------------------------
|   动作描述                       |   使用聚集索引   |   使用非聚集索引   |
|   列经常被分组排序       |             应             |           应                   |
|   返回某范围内的数据   |             应             |         不应                 |
|   一个或极少不同值       |           不应           |         不应                 |
|   小数目的不同值           |             应             |         不应                 |
|   大数目的不同值           |           不应           |           应                   |
|   频繁更新的列               |           不应           |           应                   |
|   外键列                           |             应             |           应                   |
|   主键列                           |             应             |           应                   |  
|   频繁修改索引列           |           不应           |           应                   |
  ———————————————————————————

但是看到当“小数目的不同值”应该使用聚集索引,而“大数目的不同值”应该使用非聚集索引的时候,有些迷惑。

文中还特意指出,自增长的ID类型的字段,做主键可以,但是做聚集索引,意义不大。我想,这应该是验证ID类型字段属于“大数目的不同值”,应该使用非聚集索引吧。

主键是唯一索引,既然是唯一的,数目肯定大。比如有100万条记录,主键的可能值肯定就有100W个(不考虑复合主键),既然数目大,按照这个逻辑,主键应该使用非聚集索引。但是主键默认都是聚集索引,这是不是有些矛盾?

原文见:http://www.vckbase.com/document/viewdoc/?id=1307



------解决方案--------------------
SQL Server默认的创建的主键是聚集索引,确实是这样。
对于小数据量来说,比如几百条,使用聚集/非聚集影响都不大。
但是对于大数据量的数据来说,比如亿级数据量,就需要做详细的考虑了。
------解决方案--------------------
但是看到当“小数目的不同值”应该使用聚集索引,而“大数目的不同值”应该使用非聚集索引的时候,有些迷惑。
————————————————————————
我的理解是:在SQLSERVER中如果对“大数目的不同值”使用聚集索引,因为聚集索引是对键物理位置的索引,由于大数目的不同值导致SQLSERVER需要在insert数据的时候不断调整物理存储位置,这样肯定导致性能下降。
------解决方案--------------------
之所以主键默认为聚集索引,我觉得SQLSERVER是不是做了这样的考虑。
因为对于一张数据表来说,一般情况下都会涉及对其的增删改操作,其中,删改都会通过主键作为条件找到相应表记录,此时理论上,聚集索引的性能优于非聚集索引。
lz可以去看看聚集索引、非聚集索引相关的原理图。
------解决方案--------------------
首先主键一定是索引字段(不是聚集索引就得是非聚集索引)

对于数据量小的这个影响不大,对于大数据量的聚集索引选择那就需要测试一下经常应用的查询应用了。