2014-07-19 103 views
1

首先感谢您花时间阅读本文。我试图回答关于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` 
); 
+0

CITY表格上有什么指数? –

+0

无Pieter Geerkens。 – user2820879

回答

1

您可能认为此查询只执行一次子查询,保留结果,然后将其与外部查询中的行进行比较。但是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查询可以高效地运行。

+0

谢谢Bill Karwin。我会采纳你的建议并复制它们来检查改进。 – user2820879

+0

祝你好运!让我们知道它是否有帮助。 –

+0

它确实有帮助!再一次感谢Bill Karwin。 – user2820879