У меня есть таблица the_table
с атрибутами the_table.id
, the_table.firstVal
и the_table.secondVal
(конечно, первичный ключ the_table.id
).
После определения индекса для первого неключевого атрибута следующим образом:
CREATE INDEX idx_firstval
ON the_table (firstVal);
Результат EXPLAIN
для следующего дизъюнктивного (OR
) запроса
SELECT * FROM the_table WHERE the_table.firstVal = 'A' OR the_table.secondVal = 'B';
is
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
| 1 | SIMPLE | the_table | ALL | idx_firstval | NULL | NULL | NULL | 3436 | Using where
что показывает, что индекс idx_firstval
не используется. Теперь результат EXPLAIN
для следующего конъюнктивного (AND
) запроса
SELECT * FROM the_table WHERE the_table.firstVal = 'A' AND the_table.secondVal = 'B';
is
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
| 1 | SIMPLE | the_table | ref | idx_firstval | idx_firstval | 767 | const | 124 | Using index condition; Using where
который показывает используемый индекс на этот раз.
Почему MySQL предпочитает не использовать индексы для дизъюнктивного запроса, а для конъюнктивного?
Я просмотрел SO и, как было предложено в ответе в this thread, «использование OR
в запросе часто приводит к тому, что оптимизатор запросов отказывается от поиска по индексу и возвращается к сканированию». Однако это не отвечает на вопрос, почему это происходит, а просто делает.
Другой поток пытается ответить, почему разделительный запрос не не использовать индексы, но я думаю, что это не удается - просто делается вывод, что OP использует небольшую базу данных. Я хочу знать разницу между дизъюнктивным и конъюнктивным падежом.