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

Jay*_*len 111 mysql indexing

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

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 
Run Code Online (Sandbox Code Playgroud)

我试图让我的数据库运行良好,查询运行顺利

更多,您认为我应该创建一个高效数据库的想法是什么?

Exp*_*lls 135

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子句'.索引策略的一个重要经验法则.现在很明显我想到了,但之前没有发生过 (4认同)
  • 谢谢你的解释.这真的有帮助.我相信我会有更多的过滤器.我只是想确保索引日期时间字段是一个好主意,因为我们可能有重复的日期时间.但你的回答解释了:)谢谢 (3认同)
  • 如果使用 DAY(datetime) 或 HOUR(datetime) 等时间函数查询日期时间字段怎么样?在这种情况下,指数会有所帮助还是会阻碍? (3认同)

Bau*_*han 17

这里作者执行的测试显示整数unix时间戳优于DateTime.注意,他使用了MySql.但我觉得无论你使用什么数据库引擎比较整数比比较日期稍快,所以int index比DateTime索引更好.取T1 - 比较2个日期的时间,T2 - 比较2个整数的时间.在索引字段上搜索大约需要O(log(行))时间,因为索引基于一些平衡树 - 对于不同的数据库引擎可能不同,但无论如何Log(行)是常见的估计.(如果不使用位掩码或基于r树的索引).差异是(T2-T1)*Log(行) - 如果经常执行查询,可能会起作用.

  • 更好?我怀疑unix时间戳对_all_ case更好.是的,存储整数通常比存储字符串更快,但是所有[DateTime函数]呢(http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html )MySQL暴露?自己实现它们会对性能或功能产生负面影响. (53认同)
  • 我使用一个遗留的 Web 应用程序,开发人员坚持对数据库中的所有内容使用 unix 时间戳。因此,多年来处理日期绝对是一场噩梦,我花了很多时间尽可能地将所有内容迁移到日期时间或时间戳 SQL 字段。我确信在某些情况下 Unix 时间戳很有用,但通常我认为最好避免使用它们。 (4认同)

vr_*_*ver 9

我知道这个问题是几年前提出的,但我刚刚找到了解决方案。我向日期时间列添加了索引。我从调用按日期时间排序的最后 600 条记录的 1.6 秒开始,添加索引后,它下降到 0.0028 秒。我想说这是一场胜利。

ALTER TABLE `database`.`table` 
ADD INDEX `name_of_index`   (`datetime_field_from_table`);
Run Code Online (Sandbox Code Playgroud)