我目前正在尝试优化一条MYSQL语句,这需要相当长的时间。它正在运行的表是600k+,查询耗时超过10秒。
SELECT DATE_FORMAT( timestamp, '%Y-%m-%d' ) AS date, COUNT( DISTINCT (
email
) ) AS count
FROM log
WHERE timestamp > '2009-02-23'
AND timestamp < '2020-01-01'
AND TYPE = 'play'
GROUP BY date
ORDER BY date DESC我只在时间戳和类型上建立了索引,还在timestamp_type (type_2)上建立了索引。
这是解释结果,问题似乎是文件排序,但我不知道如何解决这个问题……
id: 1
select_type: SIMPLE
table: log
type: ref
possible_keys: type,timestamp,type_2
key: type_2
key_len: 1
ref: const
rows: 226403
Extra: Using where; Using filesort谢谢
发布于 2009-07-08 10:33:41
可以尝试的内容:
date列(带索引),并使用它代替您的timestamp列type和之间添加一个索引(不认为这会影响速度,但更容易读取)
所以理想情况下你会
date列,并使用date type填充它,然后将您的选择...类型=?以及两者之间的日期?还有?发布于 2009-07-08 11:29:35
首先尝试重写以仅根据类型进行过滤。然后应用您的日期范围和聚合。基本上创建一个向下过滤类型的内联视图。我知道优化器很可能已经在做这件事了,但当我试图提高性能时,我发现非常确定首先发生了什么事情是有帮助的。
发布于 2017-05-28 15:02:41
1. You can still use the below query to utilize the index on timestamp column SELECT timestamp作为日期,COUNT( DISTINCT (电子邮件))作为count FROM log WHERE timestamp > '2009-02-23 00:00:00‘和TYPE = 'play’GROUP BY date BY date DESC
2.在打印/使用时将日期时间值格式化为日期
https://stackoverflow.com/questions/1097271
复制相似问题