1

我正在使用 MySQLworld.sql数据库。究竟是什么并不重要,但重要使用的架构如下所示:

CREATE TABLE city (
  name char(35),
  country_code char(3),
  population int(11),
);
CREATE TABLE country (
  code char(3),
  name char(52),
  population int(11)
);

有问题的查询是,用英语,“对于每个国家,给我它的名称和人口,以及人口与该国人口比例最高的城市的名称和人口”

目前我有以下SQL:

SELECT t.name, t.population, c.name, c.population
FROM country c
JOIN city t
ON t.country_code = c.code
WHERE t.population / c.population = (
    SELECT MAX(tt.population / c.population)
    FROM city tt
    WHERE t.country_code = tt.country_code
)

目前,该查询在我的 SQLite 数据库上运行大约需要 10 分钟。world.sql 数据库并不大(4000-5000 行?)所以我猜我在这里做错了什么。

我目前没有任何类型的索引或任何东西:数据库是一个空数据库,其中输入了此数据集 ( https://dl.dropboxusercontent.com/u/7997532/world.sql )。谁能给我任何关于我需要修复什么以使其在合理的时间内运行的指示?

编辑:这是问题的另一个转折点:

这在 <2 秒内运行

    SELECT t.name, t.population, c.name, c.population
    FROM country c
    JOIN city t
    ON t.country_code = c.code
    WHERE t.population * 1.0 / c.population = (
        SELECT MAX(tt.population * 1.0 / c.population)
        FROM city tt
        WHERE tt.country_code = t.country_code
    )

虽然这需要 10 分钟才能运行

    SELECT t.name, t.population, c.name, c.population
    FROM country c
    JOIN city t
    ON t.country_code = c.code
    AND t.population * 1.0 / c.population = (
        SELECT MAX(tt.population * 1.0 / c.population)
        FROM city tt
        WHERE tt.country_code = t.country_code
    )

那么解决方案是在我做 JOIN 时尽可能简单地填充到 ON 子句中吗?在这种情况下,如果我这样做,我似乎可以在没有索引的情况下逃脱......

4

3 回答 3

1

对于每个国家,人口与国家人口比例最高的城市就是人口最多的城市,所以试试这个:

SELECT t.name, t.population, c.name, c.population
FROM country c
   JOIN city t
      ON t.country_code = c.code
         And population = 
              (Select Max(population) from city 
               Where country_code = c.Code)

但这可能仍然不会大大提高性能......如果你没有指标。您需要在country.code, 和上放置一个索引city.country_code

于 2013-05-09T01:12:18.110 回答
0

理想情况下,我会首先从索引开始,并考虑将预先计算 t.population / c.population 的计算字段添加到链接表中

因此,对于每个国家和城市,您可以在不计算 RBAR 的情况下查找其人口比例。

于 2013-05-09T01:09:01.467 回答
0

我建议在两个表中添加数字主键,并在城市表中的 country_code 上添加外键。好处之一是更好的性能,因为主键是索引的。

编辑从这里开始

由于该问题不要求您提供实际比率,因此不必担心尝试计算它。该国人口最多的城市将拥有该国人口的最高比例。

于 2013-05-09T01:09:54.067 回答