在巨大的 MySQL InnoDB table 中优化日期时间搜索

Optimizing Datetime searches in huge MySQL InnoDB table

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

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

搜索仅使用日期(w/o 使用小时、分钟和秒),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'

不过也只是快了一点而已。

另外,我新建了一个table,把ID(主键table),年月日时分秒放到tyniints(年份是 int(4)),对它们进行了组合索引并从主 table 执行 select 并加入到这个新的 table,但它仍然不够快,因为小时、分钟和秒的索引变得无用,而这些列未在“where”子句中提及。

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

有什么解决办法吗?

变化自

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).