有一天,我回答了一个关于SO 的问题(被认为是正确的),但是答案却使我充满怀疑。
不久,用户有了一个带有以下字段的表:
id INT PRIMARY KEY
dt DATETIME (with an INDEX)
lt DOUBLE
Run Code Online (Sandbox Code Playgroud)
查询SELECT DATE(dt),AVG(lt) FROM table GROUP BY DATE(dt)真的很慢。我们告诉他,(部分)问题是使用DATE(dt)作为字段和分组,但是db在生产服务器上并且无法拆分该字段。
因此(使用触发器)插入了另一个da DATE (with an INDEX)自动填充DATE(dt)的字段。查询SELECT da,AVG(lt) FROM table GROUP BY da要快一些,但是大约有800万条记录,大约需要60秒钟!!!
我在PC上进行了尝试,最后我发现,删除字段da查询上的索引仅用了7s,而使用DATE(dt)删除索引后只用了13s。
我一直认为用于分组的列索引可以真正加快查询速度,而不是相反(慢8倍!!!)。
为什么?是什么原因
非常感谢。
因为您仍然需要同时从索引和数据文件中读取所有数据。由于您没有使用任何where条件-您将始终拥有查询计划,该查询计划可以逐行访问所有数据,您将无法执行任何操作。
如果性能对于此查询很重要并且经常执行-我建议将结果缓存到某个临时表中,并每小时(每天等)更新一次。
为什么变慢:因为在索引数据中已经进行了排序,并且当mysql计算查询执行成本时,它认为最好使用已排序的数据,然后将其分组,然后计算总计。但这不是这种情况。
| 归档时间: |
|
| 查看次数: |
5346 次 |
| 最近记录: |