代码改变世界

关于在时间列上建聚集索引的一点讨论

2012-03-05 14:31  cluby  阅读(1433)  评论(0)    收藏  举报

近期接手一个关系类网站的项目,里面经常会用到时间排序 比如最新发的帖子要排在上面需要找出最近发言,最近加入的5个成员等等。网上有个哥们提出一种解决方案,说在时间列上建聚集索引,他也测试了效率非常好。但他在为什么有不错的效率上一直没有拿出比较合理的解释。

我决心把这个问题给搞定了:于是做了以下测试:

CREATE TABLE [dbo].[testindex](

    [id] [int] IDENTITY(1,1) NOT NULL,

    [adate] [datetime] NOT NULL,

    [bdate] [datetime] NOT NULL,

 CONSTRAINT [PK_testindex] PRIMARY KEY NONCLUSTERED

 

 

如图的表 ID主键 非聚集索引 自增 起点 1 步长1

 .adate 建立聚集索引

。bdate 上建非聚集索引

上图是打开SQLSERVER表编辑器的截图

Id这列可以看出记录的插入顺序

而 从adate这列可以看出 整张表是按时间的倒叙存放的(因为这上有倒叙聚集索引)

所以 在这列上排序是很高效的

同时 聚集索引的特性是判断等值效率高:

但同时也要注意前提:

Adate 这列最好不更新 不删除 只插入(幸运的是我这个项目刚好符合这个条件)

大多数项目应该在日期列上更新都比较少 删除最好都做成假删除,虽然多些记录单少了数据库重构索引也是值得的