在巨大的 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)
.
我正在尝试优化一个包含 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)
.