2016-01-14 2 views
0

Мне отчаянно нужно что-то ускорить этот запрос!Как ускорить запрос mysql

Это вопрос, как добавить индексы для его ускорения и что я могу изменить, чтобы сделать запрос намного быстрее?

Это фактический запрос, выполненный в phpmyadmin.

Отображение строки 0 - 6 (7 Всего запросов занял 6.4767 сек)

Это тот же запрос, но я использую UNION ALL, чтобы отобразить все результаты:

Отображение строки 0 - 29 (23074 Всего запросов занял 4.0590 сек)

SELECT `location2` as `location`, '2' as `number` 
FROM `properties` 
WHERE `price_from` BETWEEN 0 AND 999999 
AND `country` = 'spain' 
union 
SELECT `location3` as `location`, '3' as `number` 
FROM `properties` 
WHERE `price_from` BETWEEN 0 AND 999999 
AND `location2` = 'spain' 
union 
SELECT `location4` as `location`, '4' as `number` 
FROM `properties` 
WHERE `price_from` BETWEEN 0 AND 999999 
AND `location3` = 'spain' 
union 
SELECT `location5` as `location`, '5' as `number` 
FROM `properties` 
WHERE `price_from` BETWEEN 0 AND 999999 AND 
`location4` = 'spain' 
union 
SELECT `location6` as `location`, '6' as `number` 
FROM `properties` 
WHERE `price_from` BETWEEN 0 AND 999999 
AND `location5` = 'spain' 
+1

Можете ли вы показать план выполнения? Есть ли указатель на 'price_from' и (возможно, что более важно)' country'? –

+0

Как вы хотите, чтобы я показал план выполнения? Я новичок в индексах, и я не уверен, как проверить, добавлен ли индекс в порядке или нет? Я добавил некоторые индексы из phpmyadmin, но я не уверен, правильно ли я сделал это. Обычным запросом для всего БД является следующее: «Показывать строки 0 - 29 (всего 36984, запрос занял 0.0452 сек)», поэтому он загружается довольно быстро, я просто не понимаю, почему этот запрос так долго загружается. – Kev

+0

Это может помочь, возможно, http://dba.stackexchange.com/questions/24780/mysql-optimize-union-with-order-by-in-inner-queries –

ответ

1

быстрый способ повышения производительности можно было бы добавить индекс к стране. Лучшим способом построить это будет иметь идентификатор целочисленного поиска в столбце страны, добавив еще одну таблицу стран (country_id, country), а затем изменив страну = 'spain' на country_id = 1

0

Рассмотрите возможность замены UNION на UNION ALL, если это возможно, поскольку UNION сортирует и выполняет дедупликацию.

+0

Если я использую UNION ALL, я должен использовать SELECT DISTINCT, и это увеличивает время загрузки! – Kev

+0

Я просто говорил, что если вам не нужны четкие результаты. –

+0

Да, но проблема в том, что мне нужны разные результаты. – Kev

0
INDEX(country, price_from, location2), 
INDEX(location2, price_from, location3), 
... 

Эти показатели будут ускорить процесс, не только делая WHERE быстрее, но и, будучи «покрытие». Do не используют «префикс» в индексах (как предлагает Кев); это не сработает. Если ваши местоположения больше, чем (100), что это за черт? Нет «страны» имеет имя, где угодно.

Просьба предоставить SHOW CREATE TABLE, чтобы мы могли объяснить, почему вы должны не иметь массив местоположений, реализованных в виде столбцов, а вместо этого иметь отдельную таблицу.

И как только у вас есть отдельная таблица, UNIONs уходят, и запрос становится проще и быстрее.

Смежные вопросы