SQL - 主键,聚簇索引,自动增量

时间:2012-03-14 17:43:03

标签: mysql sql

我的网站显示DATE的帖子,即使SQL表是按ID排序的。由于ID的顺序并不总是与DATE的顺序相同,因此我使用ORDER BY 'DATE'运行查询。

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列不是主键,是否可以自动增加?

  3. 我想要做的是尽可能快地进行查询(我认为可以通过将DATE作为集群索引或主键来实现),但也允许每个帖子具有唯一的自动增量ID。我试图让DATE成为主键但是我得到一个错误,说“只能有一个自动列,它必须被定义为键”。

2 个答案:

答案 0 :(得分:3)

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

< - EDIT - >

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

我在techtarget.commade2mentor.com找到了有关日期作为主键的更多信息。

答案 1 :(得分:0)

如果进入它的值是无序的,那么索引很好。不强制但很好。因为它们是树,如果索引只是一个自动增量列,你每次重新生成索引时都会从一开始就得到一个不平衡的树,因为它只会被添加到一个叶子中,所以总是会增加不平衡树的(直到索引页面已满)。

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