[英]Optimizing Datetime searches in huge MySQL InnoDB table
我正在尝试优化一个包含 5000 万行的大型 MySQL InnoDB 表。 它是一种日志。 每行包含一些带有信息的列和一个日期时间列。
这 5000 万行只包含 5-6 个日期,因此只有几个不同的日期,但具有不同的小时、分钟和秒。 每行都有一个唯一的 ID(主键)。 DateTime 列有一个索引。
使用唯一的日期(不使用小时、分钟和秒)执行搜索,fe
select * from table where date(datetime_column) = '2021-03-08'
我已经尝试重写没有 date() function 的查询,例如:
select * from table where datetime_column >= '2021-03-08' and datetime_column <='2021-03-08 23:59:59'
但它只是快一点。
另外,我创建了一个新表,将 ID(主表中的主键)、年、月、日、小时、分钟和秒放入 tyniints(年份为 int(4)),并进行组合索引在它们上执行 select 从主表连接到这个新表,但它仍然不够快,因为小时、分钟和秒的索引变得无用,而这些列在“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)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.