关于在时间列上建聚集索引的一点讨论
2012-03-05 14:31
218 查看
近期接手一个关系类网站的项目,里面经常会用到时间排序 比如最新发的帖子要排在上面需要找出最近发言,最近加入的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 这列最好不更新 不删除 只插入(幸运的是我这个项目刚好符合这个条件)
大多数项目应该在日期列上更新都比较少 删除最好都做成假删除,虽然多些记录单少了数据库重构索引也是值得的
我决心把这个问题给搞定了:于是做了以下测试:
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 这列最好不更新 不删除 只插入(幸运的是我这个项目刚好符合这个条件)
大多数项目应该在日期列上更新都比较少 删除最好都做成假删除,虽然多些记录单少了数据库重构索引也是值得的
相关文章推荐
- 关于通过聚集索引以及堆来对比数据表组织结构-SQLServer最优实践 的一点看法
- 关于通过聚集索引以及堆来对比数据表组织结构-SQLServer最优实践 的一点看法
- 关于VC中的时间函数讨论
- 关于聚集索引的一些总结
- 笔记:关于 FFMPEG 中时间戳的一点小知识(1)
- 关于C#的索引一点认识
- 针对Lucene 建立索引过程与搜索过程耗费时间的矛盾一点思路
- 关于JAVA匿名内部类的一点讨论.
- 关于sql的聚集索引
- 关于index_ffs使用索引的一点问题.
- 关于JAVA匿名内部类的一点讨论
- 关于CSDN。济南区聚会的时间、地点、费用的讨论
- 关于这段时间的一点杂谈
- 关于用Stroyboard 自定义 UITableViewCell 的一点讨论
- 关于asp.net做大型门户网站的一点讨论,欢迎拍砖
- 关于Response.Write输出的一点讨论!
- 关于项目需求讨论的一点想法 推荐
- 关于JAVA匿名类和内部类的一点讨论
- 关于职业目标规划的一点讨论
- 关于时间和空间复杂度的一点小结