#mysql #sql
Вопрос:
Я использую MySQL 8.
Мой вопрос таков:
SELECT * FROM users WHERE status = 1 ORDER BY id
Связанными столбцами и статусами индекса являются:
id
: Первичный ключ (Индексированный)status
: Индексированный
Мой вопрос таков:
Оба id
и status
индексируются. Мне все еще нужен отдельный составной индекс (статус, идентификатор)?
Ответ №1:
Можно использовать только один индекс на SELECT
каждого. Таким образом, наличие разных индексов в разных столбцах не поможет (так сильно), когда все разные столбцы связаны в один SELECT
.
В вашем случае вы можете попробовать использовать индекс users (status, id)
. Используйте EXPLAIN
, чтобы проверить, заберут ли его.
Ответ №2:
Если вы используете InnoDB, вторичный индекс в status
любом случае неявно содержит первичный ключ. Это как если бы у тебя был указатель (status, id)
.
Таким образом , вы бы выбрали строки с заданным значением status=1
, а затем InnoDB прочитал бы эти строки в порядке индексации, и это означает, что они будут возвращены по порядку id
. Поскольку это соответствует вашему ORDER BY
предложению, оптимизатор знает, что он может пропустить любую работу по сортировке результата.
Вы можете использовать EXPLAIN
это для подтверждения. Что вы будете искать, так это отсутствие «Использование сортировки файлов» в дополнительном поле отчета «ОБЪЯСНЕНИЕ».