mysql - 缓慢的 MySQL 查询

标签 mysql performance filesort

嘿,我有一个非常慢的 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 CACHEFLUSH 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/

相关文章:

MySQL - 按天计算多个表

mySQL 从两个表中选择并匹配结果

javascript concat 与推送基准

c# - 在 WPF 中构建 CAD 程序

mysql - 我怎样才能提高这个 MySQL 查询的性能?

mysql - 什么是 SQL 来选择属性和相关属性的最大出现次数?

php - 按大于今天的日期 (d-M-Y) 对 SQL 结果进行排序

performance - 如何加速 MATLAB 代码?

Mysql慢查询: INNER JOIN + ORDER BY causes filesort

Mysql:按两列排序,使用文件排序