有一天我回答了一个question https://stackoverflow.com/questions/5642880/slow-mysql-query/5642908#5642908就这样(被认为是正确的),但答案给我留下了很大的疑问。
不久,用户就有了一个包含以下字段的表:
id INT PRIMARY KEY
dt DATETIME (with an INDEX)
lt DOUBLE
查询SELECT DATE(dt),AVG(lt) FROM table GROUP BY DATE(dt)
真的很慢。
我们告诉他(部分)问题在于使用DATE(dt)作为字段和分组,但数据库位于生产服务器上,无法拆分该字段。
所以(用触发器)插入了另一个字段da DATE (with an INDEX)
自动填充DATE(dt). Query SELECT da,AVG(lt) FROM table GROUP BY da
有点快,但是大约有 800 万条记录,大约需要 60 秒!
我在我的电脑上尝试了一下,最后我发现,删除了字段上的索引da查询只花了7秒,而使用DATE(dt)删除索引后花了13秒。
我一直认为用于分组的列上的索引确实可以加快查询速度,而不是相反(慢 8 倍!!!)。
为什么?到底是哪一个原因呢?
多谢。
因为您仍然需要从索引+数据文件中读取所有数据。由于您没有使用任何where
条件 - 您始终会拥有查询计划,该计划可以逐行访问所有数据,并且您对此无能为力。
如果性能对此查询很重要并且经常执行 - 我建议将结果缓存到某个临时表中并每小时(每天等)更新一次。
为什么它变得更慢:因为索引中的数据已经排序,当mysql计算查询执行的成本时,它认为最好使用已经排序的数据,然后对其进行分组,然后计算聚合。但本例并非如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)