5

我经常使用以下查询:

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 字节)或日期时间(mysql 5.6 中的 5 字节)?

4

2 回答 2

9

四百万行并不大。

数据类型 datetime 和 timestamp 之间的一个字节差异是您在这两种数据类型之间进行选择时应该考虑的最后一件事。查看他们的规格

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

在您的时间戳列上放置一个索引。获取执行计划,并将其粘贴到您的问题中。确定您的中值查询性能,并将其粘贴您的问题中。

从我的台式计算机上的索引 400 万行表中返回一天的行需要 2 毫秒。(它返回大约 8000 行。)

于 2013-05-31T11:21:02.717 回答
6

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

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

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

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

在索引字段上搜索数据需要 O(log(rows)) 树查找。整数的比较是 O(1),日期的比较是 O(date_string_length)。因此,差异是(树查找次数)*(差异比较)= O(日期字符串长度)/O(1))* O(日志(行))= O(日期字符串长度)* O(日志(行))

于 2013-05-31T08:23:45.413 回答