2012-03-14 87 views
2

即使SQL表按ID排序,我的网站也会按DATE显示帖子。由于ID的顺序并不总是与DATE的顺序相同,因此我使用ORDER BY 'DATE'运行查询。SQL - 主键,聚簇索引,自动增量

SQL表举例:

---------------------------- 
| ID | DATE    | 
---------------------------- 
| 1 | 2011-10-20 00:00:00 | 
| 2 | 2012-10-20 00:00:00 | 
| 3 | 2010-10-20 00:00:00 | 
| 4 | 2011-09-20 00:00:00 | 
---------------------------- 

To query I use: SELECT * FROM `table` ORDER BY 'DATE'; 

我的问题:

  1. 会受益的查询性能,如果表中的聚簇索引或主键是DATE列?

  2. 是否有可能使ID列自动增量,当它不是主键?

我想要做的是使查询尽可能快的(我想这将有可能通过使DATE簇索引或主键),而且还允许每个帖子都有一个唯一的自动增量ID。我试图让DATE成为主键,但我得到一个错误,说“只能有一个自动列,并且它必须被定义为一个键”。

+1

'ORDER BY'DATE''将不会对您的结果进行排序,因为按照常量字符串DATE排序,而不是按DATE列的值进行排序。由于您在列名称中使用保留字,因此您需要使用'''或反引号(使用'table'的方式)引用它。 – 2012-03-14 18:33:35

回答

3

我不会将日期定义为主键,而是在该字段上添加索引。独特的,如果需要。我相信有可能在非主键字段上有一个自动增量,但自己尝试它会给你最好的答案!

< - 编辑 - >

为了回答您的评论的问题,我不能说其是一个坏主意,但日期总是挑剔。有一次,您必须决定是否使用UTC或本地日期,预览夏令时如何影响您的程序,预见在应用程序生命的某个时间是否有可能需要更新日期等等。我宁愿忘记这一点,只用独特的自动生成的密钥。 如果确实要将日期作为PK,则可以使用时间戳并避开第二个序列列。

我在techtarget.commade2mentor.com找到了更多关于日期的信息。

+0

因此,将聚合索引设置为日期是个坏主意? – supercoolville 2012-03-14 20:42:04

+0

@supercoolville我在帖子中添加了我的答案,因为它太长了:) – 2012-03-14 23:43:45

0

对于索引来说,如果进入它的值是无序的,那很好。不是强制性的但很好。既然它们是树,如果索引只是一个自动增量列,那么每次从索引中删除索引时,最终会得到一个不平衡的树,因为它只会被添加到一个叶中,所以在保证新增数据时总是会失去平衡(直到索引页面已满)。

对于自动增量字段上的聚簇索引(Sybase,MS SQL和其他所有的主键默认情况下),执行相对频繁的索引重建可能是一个好主意。我的理念是聚焦最常见的扫描。所以我可能会将我的主键设置为ID列,但我会在DATE上进行聚类,因此当我执行诸如从表格中选择日期时,或者选择...按日期排序时,查询会在读取页面时扫描连续的项目关闭磁盘。

相关问题