Is it a good idea to index datetime field in mysql?
我正在设计一个大型数据库。 在我的应用程序中,我将有很多行,例如我目前有一个表有400万条记录。 我的大多数查询都使用datetime子句来选择数据。 在mysql数据库中索引datetime字段是一个好主意吗?
我试图让我的数据库运行良好,查询运行顺利
更多,您认为我应该创建一个高效数据库的想法是什么?
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子句中使用的列)。
-
谢谢你的解释。这真的有帮助。我相信我会有更多的过滤器。我只是想确保索引日期时间字段是一个好主意,因为我们可能有重复的日期时间。但你的回答解释了:)谢谢
-
+1'用于连接和where子句'。索引策略的一个重要经验法则。现在很明显我想到了,但之前没有发生过
-
但是,如果您使用日期范围查询数据,例如数据范围从"2017-01-01 11:20"到"2018-01-03 12:12",即使我没有使SELECT查询更快索引date time列...索引在我使用equal操作时快速查询..我是对的吗?
-
如果使用DAY(datetime)或HOUR(datetime)等时间函数查询datetime字段怎么样?在这种情况下,指数会帮助还是阻碍?
-
嗨@Explosion Pills,如果我只需要查询年份和月份的表格,如果我创建一个只有年份和月份的新列然后将其编入索引,我将获得更好的性能,而不是直接创建datetime列的索引?比如我创建一个值为201801的列。
这里作者执行的测试显示整数unix时间戳优于DateTime。注意,他使用了MySql。但我觉得无论你使用什么数据库引擎比较整数比比较日期稍快,所以int index比DateTime索引更好。取T1 - 比较2个日期的时间,T2 - 比较2个整数的时间。在索引字段上搜索大约需要O(log(行))时间,因为索引基于一些平衡树 - 对于不同的数据库引擎可能不同,但无论如何Log(行)是常见的估计。 (如果不使用位掩码或基于r树的索引)。差异是(T2-T1)* Log(行) - 如果经常执行查询,可能会起作用。
-
谢谢。我当时认为这是一个选择,但不知道如何处理它。我相信你绝对正确的整数总是更快。
-
更好?我怀疑unix时间戳对所有情况都更好。是的,存储整数通常比存储字符串更快,但是MySQL暴露的所有DateTime函数呢?自己实现它们会对性能或功能产生负面影响。