MySQL должен преобразовать первый столбец вашего индекса (customer_id, sale)
в целое число. Таким образом, второй столбец нельзя использовать для сортировки.
... where customer_id=2 ...
будет истинным для customer_id
s со значениями varchar '2'
, '02'
, '002'
, '2 and a half men'
и многими другими. Он не может перейти к '2'
, прочитать первую строку и предположить, что это строка с наименьшим значением sale
, поскольку также может быть '02'
с меньшим значением sale
. Только это позволит MySQL не сортировать.
Вместо этого он должен go просмотреть всю таблицу, преобразовать каждую строку, проверить, = 2
ли она после преобразования, взять те, которые есть, и отсортировать все, что осталось. Вот почему у вас есть сортировка файлов. MySQL не знает, что у вас нет ничего другого, что могло бы привести к 2.
Фактически, он мог бы сделать то же самое с первичным ключом. Поскольку ваш индекс покрывает, они эквивалентны.
Вы можете проверить это, если проведете сравнение с varchar, для которого не требуется приведение типов, поэтому найденные им записи индекса правильно упорядочены по второму столбцу sale
:
... where customer_id='2' ...
Теперь он может делать именно то, что ожидалось: перейти на '2'
, взять первую строку, остановиться. Сортировка не требуется. MySQL знает: это строка с наименьшим значением для sale
.
Ваш индекс (sale, customer_id)
работает следующим образом: он считывает все значения, упорядоченные по продаже, пока не достигнет значения ( autocasted), равное 2
. Теперь MySQL может быть уверен, что это именно тот, который вам нужен (поскольку вы уже проверили все более низкие значения sale
, ни одно из них не соответствует вашему условию customer_id
. Таким образом, упорядочивание не требуется.