【发布时间】: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