Для AND подходит составной B-tree индекс по имени и фамилии. Для OR обычно нужны индексы с каждым из полей первым; один (lastName, firstName) не гарантирует быстрый поиск по одному firstName.
Определение наилучших индексов для повышения производительности SQL‑запросов
Для AND подходит составной B-tree индекс по имени и фамилии. Для OR обычно нужны индексы с каждым из полей первым; один (lastName, firstName) не гарантирует быстрый поиск по одному firstName.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В системе есть запрос, который работает без использования индексов. Необходимо предложить оптимальный индекс (или набор индексов), который максимально ускорит выполнение данного запроса.
SELECT email, firstName, lastName, role FROM User WHERE firstName = ? AND lastName = ?;
SELECT email, firstName, lastName, role FROM User WHERE firstName = ? OR lastName = ?;
(lastName, firstName)
Ответ
Для AND подходит составной B-tree индекс по имени и фамилии. Для OR обычно нужны индексы с каждым из полей первым; один (lastName, firstName) не гарантирует быстрый поиск по одному firstName.
Когда оба условия — равенства, оба порядка составного ключа могут работать; выбор зависит и от других запросов. Для OR оптимизатор может объединить отдельные индексные выборки, но при низкой селективности предпочтёт сканирование. Проверьте EXPLAIN на реальных данных. Добавление email и role ради покрытия увеличивает индекс и стоимость записи, поэтому не является обязательным улучшением.
Источник: dev.mysql.com.