【问题标题】:Optimizing Datetime searches in huge MySQL InnoDB table优化大型 MySQL InnoDB 表中的日期时间搜索
【发布时间】:2021-03-08 15:53:26
【问题描述】:

我正在尝试优化一个包含 5000 万行的大型 MySQL InnoDB 表。它是一种日志。每行包含一些包含信息的列和一个日期时间列。

这 5000 万行仅包含 5-6 个日期,因此只有几个不同的日期,但具有不同的小时、分钟和秒。每行都有一个唯一的 ID(主键)。 DateTime 列有一个索引。

使用唯一的日期(不使用小时、分钟和秒)执行搜索,f.e.

select * from table where date(datetime_column) = '2021-03-08'

我已经尝试过重写没有 date() 函数的查询,例如:

select * from table where datetime_column >= '2021-03-08' and datetime_column <='2021-03-08 23:59:59'

但它只是快一点。

另外,我创建了一个新表,将 ID(主表中的主键)、年、月、日、小时、分钟和秒放入 tyniints(年份为 int(4)),制作对它们进行组合索引,并从主表中执行选择并连接到这个新表,但它仍然不够快,因为小时、分钟和秒的索引变得无用,而“where”子句中没有提到这些列。

另外,我也考虑过分区,但我认为它也无济于事。

关于如何解决它的任何想法?

【问题讨论】:

  • 您是否通过对EXPLAIN 的查询进行分析,确认使用了索引?如果只有几个不同的日期,并且给定的日期可能匹配 20% 或更多的行,那么优化器可能会选择不使用索引。
  • 您最常见的查询是什么?真的是select * from table where column = a date吗?平均而言,每天似乎有 1000 万条记录。为给定的一天选择 1000 万条记录需要时间。
  • 使用 date() 函数时 - 跳过索引。当我在没有 date() 的情况下运行查询时 - Datetime 归档的索引工作正常。但它几乎没用的问题,因为表中只有 5-6 个不同的天,有许多不同的小时/分钟/秒,所以没有提及小时/分钟/秒的查询与使用 date() 函数的查询所花费的时间几乎相同(完全没有索引)
  • zedfoxus,是的,我已经简化了查询,还有一些 where 子句,但总的来说是的 - 查询比如 where column = a date, or column between ... 。当我从查询中删除除 datetime 之外的所有其他 where 子句时,速度几乎保持不变。
  • 请在您的问题中添加:(1)实际查询,不是简化查询,所以我们可以看到其他WHERE子句条款,(2)SHOW CREATE TABLE的结果所以我们看到您的列、数据类型和索引,以及 (3) EXPLAIN 分析您的实际查询的结果。

标签: mysql datetime optimization indexing innodb


【解决方案1】:

改变

PRIMARY KEY(id),
INDEX(datetime)

PRIMARY KEY(datetime, id),  -- to greatly speed up your range query
INDEX(id)   -- sufficient to keep AUTO_INCREMENT happy

不要使用DATE(datetime) = constant;它不能使用任何索引。在某些情况下,您的其他尝试可以使用索引。我喜欢这种表达方式:

WHERE datetime >= '2021-03-08'
  AND datetime  < '2021-03-08' + INTERVAL 1 DAY

哦,你说 WHERE 还有更多?让我们看看他们;它可能会产生很大的不同!另外,让我们知道是日期时间范围完成了大部分过滤还是其他子句完成了更多过滤。

许多查询看起来像

WHERE datetime in some range AND abc=123

这得益于INDEX(abc, datetime)按此顺序。将PK技巧拉到上面可能也有好处:PRIMARY KEY(abc, datetime, id), INDEX(id)

【讨论】:

  • 首先将日期时间放入主键有很大帮助。我还按日期进行了分区并得到了我需要的东西。谢谢!
猜你喜欢
  • 2011-05-13
  • 1970-01-01
  • 2017-01-07
  • 2019-02-10
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多