使用时间戳(或日期时间)作为主键(或聚集索引的一部分)的一部分

时间:2013-05-31 06:36:21

标签: mysql sql database-design query-optimization

我经常使用以下查询:

SELECT * FROM table WHERE Timestamp > [SomeTime] AND Timestamp < [SomeOtherTime] and publish = 1 and type = 2 order by Timestamp

我想优化这个查询,我想把时间戳作为聚合索引的主键的一部分,我想如果时间戳是主键的一部分,插入表中的数据按时间戳字段顺序写入磁盘。此外,我认为这会大大改善我的查询,但我不确定这是否会有所帮助。

table has 3-4 million+ rows.
timestamp field never changed.
I use mysql 5.6.11

另一点是:如果这是改进我的查询,最好使用时间戳(mysql 5.6中的4个字节)或datetime(mysql 5.6中的5个字节)?

2 个答案:

答案 0 :(得分:6)

四百万行不是很大。

数据类型datetime和timestamp之间的一个字节差异是在选择这两种数据类型时应考虑的 last 事物。 Review their specs

制作主键的时间戳部分是个坏主意。考虑查看主键在SQL数据库中的含义。

在时间戳列上添加索引。获取执行计划,并将其粘贴到您的问题中。确定中位数查询效果,并将 粘贴到您的问题中。

从桌面计算机上的索引400万行表中返回一天的行需要2ms。 (它返回大约8000行。)

答案 1 :(得分:4)

1)如果时间戳的值是唯一的,您可以将其设为主键。如果没有,无论如何都要在timestamp列上创建索引,因为你经常在“where”中使用它。

2)使用BETWEEN子句在这里看起来更自然。我建议你使用TREE索引(默认索引类型)而不是HASH。

3)当timestamp列被编入索引时,你不需要调用顺序 - 它已经排序了。  (当然,如果您的索引是TREE而不是HASH)。

4)整数unix_timestamp优于内存使用方和性能方的datetime - 比较日期比比较整数更复杂。

在索引字段上搜索数据需要进行O(log(行))树查找。整数的比较是O(1),并且日期的比较是O(date_string_length)。所以,区别是(树查找次数)*(差异比较)= O(date_string_length)/ O(1))* O(log(行))= O(date_string_length)* O(log(行))