我正在使用 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 子句中吗?在这种情况下,如果我这样做,我似乎可以在没有索引的情况下逃脱......