我正在使用MySQL world.sql
数据库。究竟它是什么并不重要,但重要的要使用的模式是这样的:加速缓慢的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
)
目前,查询需要大约10分钟,我的SQLite运行数据库。 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子句中?看来在这种情况下,我可以摆脱没有索引,如果我这样做...
您可以尝试在city.country_code和country.code上创建索引,并查看它是否加快速度。 – Patashu 2013-05-09 01:08:06