我经常使用以下查询:
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个字节)?
答案 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(行))