У меня есть таблица 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';
равен
| 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';
равен
| 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, и, как следует из ответа в этой теме , "использование OR
в запросе часто приводит к тому, что Оптимизатор запросов прекращает использование поиска индекса и возвращает его сканы ". Однако это не отвечает , почему это происходит, просто это делает .
Другой поток пытается ответить, почему дизъюнктивный запрос не использует индексы, но я думаю, что он не справляется с этим - просто делается вывод, что OP использует небольшую базу данных. Я хочу знать разницу между дизъюнктивным и соединительным падежом.