请教关于“主键”和“聚集索引”

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

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

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

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

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

...全文
265 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sp4 2007-07-02
  • 打赏
  • 举报
回复
首先主键一定是索引字段(不是聚集索引就得是非聚集索引)

对于数据量小的这个影响不大,对于大数据量的聚集索引选择那就需要测试一下经常应用的查询应用了。
聚集索引的选择对查询的性能有显著的影响
lee_wei 2007-07-02
  • 打赏
  • 举报
回复
之所以主键默认为聚集索引,我觉得SQLSERVER是不是做了这样的考虑。
因为对于一张数据表来说,一般情况下都会涉及对其的增删改操作,其中,删改都会通过主键作为条件找到相应表记录,此时理论上,聚集索引的性能优于非聚集索引。
lz可以去看看聚集索引、非聚集索引相关的原理图。
alino 2007-07-02
  • 打赏
  • 举报
回复
由于大数目的不同值导致SQLSERVER需要在insert数据的时候不断调整物理存储位置,这样肯定导致性能下降。
------------------------------
明白了

但是对于大数据量的数据来说,比如亿级数据量,就需要做详细的考虑了。
------------------------------
是否在某种情况,将主键设置为聚集索引,比作为非聚集索引有明显的大的优势呢?不然为什么要默认为聚集索引呢?
在小的数据量下,聚集与非聚集差别不大,但是大的数据量下,由于数据量大,主键的不同值也大,那么是否非聚集更适合主键呢?这么来看,如果真的考虑默认值的话,不是将主键默认为非聚集索引更适合吗?
lee_wei 2007-07-02
  • 打赏
  • 举报
回复
但是看到当“小数目的不同值”应该使用聚集索引,而“大数目的不同值”应该使用非聚集索引的时候,有些迷惑。
————————————————————————
我的理解是:在SQLSERVER中如果对“大数目的不同值”使用聚集索引,因为聚集索引是对键物理位置的索引,由于大数目的不同值导致SQLSERVER需要在insert数据的时候不断调整物理存储位置,这样肯定导致性能下降。
lee_wei 2007-07-02
  • 打赏
  • 举报
回复
SQL Server默认的创建的主键是聚集索引,确实是这样。
对于小数据量来说,比如几百条,使用聚集/非聚集影响都不大。
但是对于大数据量的数据来说,比如亿级数据量,就需要做详细的考虑了。
alino 2007-07-02
  • 打赏
  • 举报
回复
意思是主键默认为聚集索引只是考虑认为主键可能使用频率高,所以设计为性能更高的聚集索引,是吗?明白了
我再去看看聚集索引的结构去,谢谢大家
chongxiaoyihe 2007-07-02
  • 打赏
  • 举报
回复
聚集索引是在数据库按物理顺序进行排序,自增长的ID本来就是排序增加的,再加个聚集索引没什么意义

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧