Изучаю данные индекса MySQL в книге «Высокая производительность MySQL», и я не могу понять одну вещь.Использование индексации индексов MySQL для сортировок
В книге говорится, (с.124 Использование индексных Сканы для Сорта)
MySQL имеет два способа произвести заказанные результатов: он может использовать FileSort, или он может сканировать индекс в порядке.
заказа результаты по индексу работает только тогда, когда порядок индекса является точно так же, как предложения ORDER BY и все столбцы сортируются в одинаковое направление (по возрастанию или по убыванию).
Предложение ORDER BY также имеет те же ограничения, что и запросы поиска: ему необходимо сформировать крайний левый префикс индекса. Во всех остальных случаях MySQL использует файлосад.
далее, авторы дают некоторые примеры использования MySQL Sakila в примере базы данных [http://dev.mysql.com/doc/sakila/en/][1]
Первый пример работает отлично:
прокат стол в стандартной базе данных Sakila образца имеет индекс по (rental_date, inventory_id, customer_id):
CREATE TABLE rental (
...
PRIMARY KEY (rental_id),
UNIQUE KEY rental_date (rental_date,inventory_id,customer_id),
KEY idx_fk_inventory_id (inventory_id),
KEY idx_fk_customer_id (customer_id),
KEY idx_fk_staff_id (staff_id),
...
);
MySQL использует индекс rental_date заказать следующий запрос, как вы можете видеть из-за отсутствия FileSort в EXPLAIN:
> mysql> EXPLAIN SELECT
> rental_id, staff_id FROM sakila.rental
> -> WHERE rental_date = '2005-05-25'
> -> ORDER BY inventory_id, customer_id\G
> *************************** 1. row ***************************
> type: ref
> possible_keys: rental_date
> key: rental_date
> rows: 1
> Extra: Using where
Это работает, даже если ORDER BY статьи не сам a левый префикс индекса, поскольку мы указали условие для первого столбца в индексе.
Важно отметить: они используют столбцы индекса в предложении where, но используют разные столбцы в запросе SELECT.
Второй пример приведены в коротком образом:
Следующий запрос также работает, потому что две колонны в ORDER BY являются крайний левый префикс индекса:
.. ,WHERE rent_date> '2005-05-25' ORDER BY rent_date, inventory_id;
Но здесь вы можете получить другой результат, а селекты содержания колонка:
Первой ситуацию, используются FileSort:
EXPLAIN
SELECT `rental_id`, `staff_id` FROM `sakila`.`rental`
WHERE `rental_date` > '2005-05-25'
ORDER BY `rental_date`, `inventory_id`;
Типа: ALL possible_key: rental_date
ключа: NULL Дополнительно: использование где; используя FileSort
Вторая ситуация, используется индекс:
EXPLAIN
SELECT `rental_id`, `rental_date`, `inventory_id` FROM `sakila`.`rental`
WHERE `rental_date` > '2005-05-25'
ORDER BY `rental_date`, `inventory_id`;
Тип: Диапазон possible_key: rental_date ключ: rental_date Дополнительно: Использование где; Использование индекса
Почему это работает в этой странной манере? Как показано выше, в первом примере использовалась сортировка индексов, даже если в предложении SELECT были включены разные столбцы с предложением WHERE.