【问题标题】:Mysql Performance QueryMysql性能查询
【发布时间】:2014-07-19 17:16:58
【问题描述】:

首先感谢您花时间阅读本文。我正在尝试回答一些关于 mysql 的问题,但我被困在几个问题上,这就是为什么我决定在可能的情况下寻求某人的帮助。或者至少为我指明正确的方向。任何帮助将不胜感激。

City 表包含 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`
);

【问题讨论】:

  • CITY 表上有哪些索引?
  • 无 Pieter Geerkens。

标签: mysql performance select greatest-n-per-group


【解决方案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) 上按顺序在 City 上建立索引,这样 GROUP BY 查询才能高效运行。

【讨论】:

  • 谢谢比尔·卡尔文。我会采纳您的建议并复制它们以检查改进。
  • 祝你好运!如果有帮助,请告诉我们。
猜你喜欢
  • 2011-05-06
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 2016-03-09
相关资源
最近更新 更多