在mysql中索引datetime字段是一个好主意吗?


137

我正在设计一个大型数据库。在我的应用程序中,我将有很多行,例如,我目前有一个包含400万条记录的表。我的大多数查询都使用datetime子句来选择数据。索引mysql数据库中的datetime字段是一个好主意吗?

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 

我正在努力保持数据库正常运行,并且查询运行平稳

此外,您认为创建高效数据库应该有什么主意?


什么field 20
AlikElzin-kilaka

Answers:


164

MySQL建议出于各种原因使用索引,包括消除条件之间的行:http : //dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

如果要在查询中频繁使用的条件下使用datetime列,则它是索引的理想选择。如果唯一条件是条件,BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)并且条件中没有其他索引,则MySQL将必须对每个查询进行全表扫描。我不确定30天内会产生多少行,但是只要它少于总行的1/3,在列上使用索引会更有效。

关于创建高效数据库的问题非常广泛。我要说的只是确保它被规范化并且所有适当的列都被索引了(即在联接和where子句中使用的列)。


3
谢谢你的解释。那真的有帮助。我相信我会对此进行更多过滤。我只想确保索引datetime字段是个好主意,因为我们可能有重复的日期时间。但是您的回答解释了它:)谢谢
Jaylen 2013年

4
+1表示“用于联接和where子句的一个”。索引策略的一个很好的经验法则。现在很明显,我已经考虑过了,但是之前
从未想到过

1
但是,如果您使用日期范围查询数据,例如从“ 2017-01-01 11:20”到“ 2018-01-03 12:12”的数据范围,SELECT即使我索引了date time列,查询也不会更快。 ..使用equal操作时,索引使查询快速。.是吗?
user3595632 '18

1
如何用诸如DAY(datetime)或HOUR(datetime)之类的时间函数查询datetime字段。在这种情况下,索引会有所帮助还是不利?
cronoklee

嗨,@@@@@@@@@@@@@@@@@@@@ [爆炸药丸,您好,如果我只需要查询年和月的表基,如果我创建了一个只包含年和月的新列,然后对其进行索引,而不是直接创建datetime列的索引,我会得到更好的性能。 ?比如,我创造它的值是像201801.列
伍兹陈

18

在这里,作者进行的测试表明,整数unix时间戳优于DateTime。注意,他使用了MySql。但是我感觉无论您使用哪种数据库引擎比较整数都比比较日期稍快,因此int索引比DateTime索引要好。以T1-比较2个日期的时间,T2-比较2个整数的时间。在索引字段上进行搜索大约需要O(log(rows))时间,因为基于某种平衡树的索引-对于不同的DB引擎,索引可能有所不同,但无论如何,log(rows)是常见的估计。(如果您不使用基于位掩码或基于r树的索引)。因此,差异是(T2-T1)* Log(rows)-如果您经常执行查询,则可能会起作用。


谢谢。我当时正在考虑将其作为一种选择,但不知道如何实现。我相信您绝对正确,整数总是更快。
Jaylen 2013年

62
更好?我怀疑unix时间戳在所有情况下都更好。是的,存储整数通常比存储字符串快,但是MySQL公开的所有DateTime函数呢?自己实施它们会对性能或功能产生负面影响。
格雷格2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.