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 句にできるだけ多くを詰め込むことですか? この場合、そうすればインデックスなしで逃げることができるようです...