首先,感谢您抽出宝贵时间阅读本文。我正在尝试回答有关mysql的一些问题,但我只停留在一些问题上,这就是为什么我决定在可能的情况下寻求他人的帮助。或至少可以指出正确的方向。任何帮助将不胜感激。
城市表包含230个国家/地区的4000个城市的人口数据。说明以下查询在MySQL 5.6中的性能差的原因,并演示解决方案。
SELECT `ID`, `CountryCode`, `Name`, `District`, `Population`
FROM `City`
WHERE (`CountryCode`, `Population`) IN (
SELECT `CountryCode`, MAX(`Population`) AS `Population`
FROM `City`
GROUP BY `CountryCode`
);
您可能会认为此查询仅执行一次子查询,保留结果,然后将其与外部查询中的行进行比较。但是MySQL并非如此。MySQL在优化器的智能方面存在差距,因此它将子查询视为从属子查询,并针对外部查询的每个不同值重新执行它。
要解决此问题,请将子查询作为派生表移入FROM子句。它将执行一次子查询,并将结果保留为内部临时表。然后联接到表的另一个实例。
SELECT `ID`, `CountryCode`, `Name`, `District`, `Population`
FROM `City`
JOIN (
SELECT `CountryCode`, MAX(`Population`) AS `Population`
FROM `City`
GROUP BY `CountryCode`
) AS _max USING (`CountryCode`, `Population`);
另外,您应该(CountryCode,Population)
按该顺序在两列上的城市索引,以便GROUP BY查询可以高效运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句