Я использую базу данных MySQL world.sql
. Именно то, что в нем не имеет значения, но схема, которая имеет значение для использования выглядит следующим образом:Ускорение медленного 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). Может ли кто-нибудь дать мне какие-либо указания относительно того, что мне нужно исправить, чтобы заставить его работать в течение разумного промежутка времени?
EDIT: ну вот еще один поворот на вопрос:
Это работает в < 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
)
Является ли решение затем просто как можно больше вставляйте предложение ON, когда я делаю JOINs? Кажется, в этом случае я могу уйти без индекса, если я это сделаю ...
Вы можете попробовать сделать указатель на city.country_code и country.code и посмотреть, ускоряет ли он его. – Patashu