MySQL性能查询

用户名

首先,感谢您抽出宝贵时间阅读本文。我正在尝试回答有关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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章