Итак, что мы имеем.
- 3 связанные таблицы, в них хранится порядка 2млн записей.
- Запрос, где эти таблицы через LEFT JOIN собираются воедино.
- Условие, что все должно быть отсортировано по имени.
- Все должно работать быстро.
В общем то, вполне тривиальное задание, если бы не последнее условие
Рассмотрим на более простом примере. Таблица `catalog_software` с 25 тысячами записей. Без всяких связаных таблиц
SELECT * FROM `catalog_software` LIMIT 1000;
Запускаем запрос через phpMyAdmin - видим, что выполнение запроса заняло 0.09 секунд.
Задумываемся - что-то забыли... Ах да, сортировка. Быстренько все исправляем.
SELECT * FROM `catalog_software` ORDER BY `name` LIMIT 1000;
Опять таки выполняем запрос через phpMyAdmin... И тут шок - запрос выполняется 0.26 секунд (на реальном примере - разница 0.12 секунд против 1.8).
Вспоминаем теорию, как работает запрос с ORDER BY.
Шаг 1 - выгребаем все, сортируем.
Шаг 2 - отсчитываем 1000 и возвращаем их.
То есть как становится понятно - в первом случае "шаг 1" отсутствовал.
В общем завис я на этом хорошо... Но, спустя 2 часа размышлений - я вспомнил одну вещь и решил проверить.
CREATE OR REPLACE VIEW `soft_by_name` AS SELECT * FROM `catalog_software` ORDER BY `name`;
И соответсвенно далее:
SELECT * FROM `soft_by_name` LIMIT 1000;
Опять таки запускаем это все в phpMyAdmin - и вот оно, 0.13 секунд(и 0.2 секунды в реальном примере). То есть в таком случае - запрос с ORDER BY в 1.5-2 раза медленнее, чем без него(а не в 10 с лишним раз, как в реальной задаче)
(c) KuZma
Постоянные ссылки
При копировании ссылка на TeaM RSN обязательна!