加速慢速SQL查询

时间:2013-05-09 01:03:05

标签: sql database performance sqlite

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

3 个答案:

答案 0 :(得分:1)

对于每个国家而言,人口比例最高的城市是人口最多的城市,所以试试这个:

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

上添加索引

答案 1 :(得分:0)

理想情况下,我首先从索引开始,并考虑添加一个预先计算t.population / c.population到链接表中的计算字段

因此,对于每个国家和城市,您都可以在RBAR中查找没有计算的人口比率。

答案 2 :(得分:0)

我建议在两个表中添加数字主键,在city表中的country_code上添加外键。其中一个好处是性能更好,因为主键是索引的。

编辑从此处开始

由于问题没有要求您提供实际比率,因此不要担心尝试计算它。该国人口最多的城市将是该国人口比例最高的城市。