首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用时间戳(或日期时间)作为主键的一部分(或聚集索引的一部分)

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

Stack Overflow用户
提问于 2013-05-31 14:36:21
回答 2查看 15.6K关注 0票数 5

我经常使用下面的查询:

代码语言:javascript
复制
SELECT * FROM table WHERE Timestamp > [SomeTime] AND Timestamp < [SomeOtherTime] and publish = 1 and type = 2 order by Timestamp

我想优化这个查询,我正在考虑把timestamp作为聚集索引的主键的一部分,我认为如果timestamp是主键的一部分,那么插入到表中的数据将按timestamp field.Also顺序写入磁盘。我认为这会大大改善我的查询,但不确定这是否会有帮助。

代码语言:javascript
复制
table has 3-4 million+ rows.
timestamp field never changed.
I use mysql 5.6.11

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

EN

回答 2

Stack Overflow用户

发布于 2013-05-31 19:21:03

四百万行并不算大。

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

将时间戳作为主键的一部分是一个非常非常糟糕的主意。考虑一下主键在SQL数据库中的含义。

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

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

票数 8
EN

Stack Overflow用户

发布于 2013-05-31 16:23:45

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

2)在这里使用BETWEEN子句看起来更自然。我建议您使用树索引(默认索引类型),而不是哈希。

3)当时间戳列被索引时,你不需要调用order by -它已经排序了。(当然,如果您的索引是树而不是散列)。

4)无论从内存使用还是性能方面,整数unix_timestamp都优于datetime --比较日期比比较整数复杂。

在索引字段上搜索数据需要O(log(行))树查找。整数比较为O(1),日期比较为O(date_string_length)。因此,差异是(树查找的数量)* (difference_comparison) = O(date_string_length)/O(1))* O(date_string_length(行))=O(Log)*O(log(行))

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16851129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档