[英]Speeding up a slow SQL query
我正在使用MySQL world.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子句中? 在這種情況下,如果這樣做,我似乎可以不用索引了……
對於每個國家/地區,人口與國家人口比例最高的城市就是人口最高的城市,因此請嘗試以下操作:
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
上添加city.country_code
理想情況下,我將首先從索引開始,並考慮將一個預先計算t.population / c.population的計算字段添加到鏈接表中
因此,對於每個國家和城市,您都可以查找其人口比例,而無需在RBAR中進行計算。
我建議在這兩個表中都添加數字主鍵,並在城市表中的country_code上添加外鍵。 好處之一是更好的性能,因為對主鍵進行了索引。
編輯從這里開始
由於問題並不要求您提供實際比率,因此不必擔心要計算它。 該國人口最多的城市將擁有該國人口的最大比例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.