嘿,我有一个非常慢的 MySQL 查询。我确定我需要做的就是添加正确的索引,但我尝试的所有方法都不起作用。
查询是:
SELECT DATE(DateTime) as 'SpeedDate', avg(LoadTime) as 'LoadTime'
FROM SpeedMonitor
GROUP BY Date(DateTime);
查询的解释是:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE SpeedMonitor ALL 7259978 Using temporary; Using filesort
表结构为:
CREATE TABLE `SpeedMonitor` (
`SMID` int(10) unsigned NOT NULL auto_increment,
`DateTime` datetime NOT NULL,
`LoadTime` double unsigned NOT NULL,
PRIMARY KEY (`SMID`)
) ENGINE=InnoDB AUTO_INCREMENT=7258294 DEFAULT CHARSET=latin1;
如有任何帮助,我们将不胜感激。
最佳答案
您只是在查询中请求两列,因此索引可以/应该放在那儿:
- 日期时间
- 加载时间
另一种加快查询速度的方法是将 DateTime 字段一分为二:日期和时间。
这样 db 可以直接在日期字段上分组而不是计算 DATE(...)。
已编辑:
如果您更喜欢使用触发器,请创建一个新列 (DATE) 并将其命名为 newdate,然后尝试这样做(我现在无法尝试查看它是否正确):
CREATE TRIGGER upd_check BEFORE INSERT ON SpeedMonitor
FOR EACH ROW
BEGIN
SET NEW.newdate=DATE(NEW.DateTime);
END
再次编辑:
我刚刚创建了一个数据库,其中包含大约 900,000 条记录的同一个表 speedmonitor。
然后我运行查询 SELECT newdate,AVG(LoadTime) loadtime FROM speedmonitor GROUP BY newdate
,它花了大约 100 秒!!
删除 newdate 字段上的索引(并使用 RESET QUERY CACHE
和 FLUSH TABLES
清除缓存),同样的查询用了 0.6 秒!!!
仅供比较:查询 SELECT DATE(DateTime),AVG(LoadTime) loadtime FROM speedmonitor GROUP BY DATE(DateTime)
花费了 0.9s。
所以我认为 newdate 上的索引不好:删除它。
我现在要添加尽可能多的记录并再次测试两个查询。
最终编辑:
删除 newdate 和 DateTime 列上的索引,在 speedmonitor 表上有 800 万条记录,结果如下:
- 在新日期列上进行选择和分组:7.5s
- 在 DATE(DateTime) 字段上选择和分组:13.7s
我认为这是一个很好的加速。
在 mysql 命令提示符下执行查询需要时间。
关于mysql - 缓慢的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5642880/