Я не получил ваш запрос.Если строка должна соответствовать mp_np = constant
, чтобы быть возвращенной, все возвращенные строки будут иметь одинаковые mp_nb
, поэтому включение mp_nb
в предложение order by не имеет никакого эффекта.Я рекомендую вам использовать семантически эквивалентный оператор:
SELECT * FROM met_value
WHERE rtu_nb=constant
AND mp_nb=constant
AND datetime BETWEEN constant AND constant
ORDER BY datetime
, чтобы избежать ненужной путаницы в оптимизаторе запросов.
Теперь к вашему вопросу: база данных может реализовать предложение по предложению без сортировки, если онознает, что базовый доступ вернет строки в правильном порядке.В случае индексов это означает, что индекс может помочь с сортировкой, если строки, соответствующие предложению where, появляются в индексе в порядке, запрошенном предложением order by.
Это именно тот случай, поэтомубаза данных может на самом деле выполнить сканирование диапазона индекса по met_value_index1
для строк, где rtu_nb=constant AND datetime BETWEEN constant AND constant
, а затем проверить, является ли mp_nb=constant
для каждой из этих строк, но это будет означать проверку гораздо большего количества строк, чем необходимо, если mp_nb=constant
имеетвысокая селективностьИными словами, индекс наиболее полезен, если совпадающие строки являются непрерывными в индексе, поскольку это означает, что сканирование диапазона индекса будет касаться только тех строк, которые действительно должны быть возвращены.
Следовательно, следующий индекс будет более полезным для этого запроса:
UNIQUE KEY `met_value_index2` (`RTU_NB`,`MP_NB`, `DATETIME`),
, поскольку все совпадающие строки будут находиться рядом друг с другом в индексе, а строки появляются в индексе вЗакажите order by
запросы пункта.Я не могу сказать, достаточно ли умен оптимизатор запросов, чтобы получить это, поэтому вам следует проверить план выполнения.