簡體   English   中英

加快慢速SQL查詢

[英]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.codecity.country_code上添加city.country_code

理想情況下,我將首先從索引開始,並考慮將一個預先計算t.population / c.population的計算字段添加到鏈接表中

因此,對於每個國家和城市,您都可以查找其人口比例,而無需在RBAR中進行計算。

我建議在這兩個表中都添加數字主鍵,並在城市表中的country_code上添加外鍵。 好處之一是更好的性能,因為對主鍵進行了索引。

編輯從這里開始

由於問題並不要求您提供實際比率,因此不必擔心要計算它。 該國人口最多的城市將擁有該國人口的最大比例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM