1

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

4

3 に答える 3

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.code、およびにインデックスを付ける必要がありますcity.country_code

于 2013-05-09T01:12:18.110 に答える
0

理想的には、まずインデックスから始めて、t.population / c.population を事前に計算する計算フィールドをリンク テーブルに追加することを検討します。

したがって、国や都市ごとに、RBAR で計算しなくても人口比を調べることができます。

于 2013-05-09T01:09:01.467 に答える
0

両方のテーブルに数字の主キーを追加し、city テーブルの country_code に外部キーを追加することをお勧めします。利点の 1 つは、主キーにインデックスが付けられるため、パフォーマンスが向上することです。

ここから編集開始

質問では実際の比率を提供するよう求められていないため、計算しようとしても心配する必要はありません。国内で最も人口の多い都市は、その国の人口の割合が最も高くなります。

于 2013-05-09T01:09:54.067 に答える