Итак, что мы имеем.

  • 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 обязательна!

URI

Html (ЖЖ)

BB-код (Для форумов)