在mysql中索引日期时间字段是个好主意吗?

Posted

技术标签:

【中文标题】在mysql中索引日期时间字段是个好主意吗?【英文标题】:Is it a good idea to index datetime field in mysql? 【发布时间】:2013-03-03 17:51:21 【问题描述】:

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

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

我正在努力让我的数据库保持良好的运行状态并让查询顺利运行

另外,你觉得我应该有什么想法来创建一个高效的数据库?

【问题讨论】:

field 20 是什么? 【参考方案1】:

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

如果您要在查询中频繁使用它,这会使您的日期时间列成为索引的绝佳候选者。如果您的唯一条件是 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” ",即使我索引了date time 列,它也不会使SELECT 查询更快......当我使用equal 操作时,索引会使查询速度更快.. 对吗? 如果使用 DAY(datetime) 或 HOUR(datetime) 等时间函数查询 datetime 字段怎么样。在这种情况下,索引会帮助还是阻碍? 嗨@Explosion Pills,如果我只需要根据年份和月份查询表,如果我创建一个只有年份和月份的新列然后索引它,我会获得更好的性能,而不是直接创建日期时间列的索引?比如我创建一列,其值为 201801。【参考方案2】:

Here 作者进行的测试表明整数 unix 时间戳优于 DateTime。注意,他使用的是 MySql。但是我觉得无论您使用什么数据库引擎,比较整数都比比较日期略快,因此 int 索引优于 DateTime 索引。取 T1 - 比较 2 个日期的时间,T2 - 比较 2 个整数的时间。搜索索引字段大约需要 O(log(rows)) 时间,因为索引基于一些平衡树 - 对于不同的数据库引擎可能会有所不同,但无论如何 Log(rows) 是常见的估计。 (如果您不使用位掩码或基于 r-tree 的索引)。所以区别是 (T2-T1)*Log(rows) - 如果您经常执行查询,可能会起作用。

【讨论】:

谢谢。我正在考虑将其作为一种选择,但不知道如何处理它。我相信你是绝对正确的整数总是更快。 更好?我怀疑 unix 时间戳更适合 all 情况。是的,存储一个整数通常比存储一个字符串要快,但是所有的DateTime functions MySQL 暴露了什么呢?自己实现它们会对性能或功能产生负面影响。 我使用一个遗留 Web 应用程序,开发人员坚持对数据库中的所有内容使用 unix 时间戳。因此,多年来使用日期绝对是一场噩梦,我花了很多时间尽可能地将所有内容迁移到日期时间或时间戳 SQL 字段。我确信在某些情况下 unix 时间戳很有用,但通常我认为你最好避免使用它们。 是的,MySQL 使用 5 字节表示(分隔年、月等)存储日期,这有点奇怪。

以上是关于在mysql中索引日期时间字段是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

将规范化表与非规范化索引视图一起使用是个好主意吗?

在庞大的数据集上使用 IN 是个好主意吗?

Symfony ApiPlatform:在实体中作为序列化器/组的角色是个好主意吗?

在 PHP mkdir 中使用模式 0664 是个好主意吗?

在 debounce 函数中使用 requestAnimationFrame 是个好主意吗?

选择啥列来创建聚集索引