У меня есть индексы по таблице продуктов:
QUERY:
select 'id', 'name', 'price', 'images', 'used'
from 'products'
where 'category_id' = '1' and
'subcategory_id' = '2' and
'gender_id' = '1' and
'used' = '0'
order by 'created_at' desc
limit 24 offset 0
Вопрос:
Почему mysql использует индекс
products_subcategory_id_foreign
внедрен
idx_products_cat_subcat_gender_used (индекс нескольких столбцов)
ЗДЕСЬ ОБЪЯСНЯЕТ:
1 ПРОСТОЙ продукт NULL ref products_gender_id_foreign, products_subcategory_id... products_subcategory_id_foreign 5 const 2 2.50 Использование условия индекса; Использование где; Использование filesort
Как поясняется в документации MySQL, индекс может быть проигнорирован в некоторых случаях. Те, которые могут применяться в вашем случае, поскольку один из индексов уже используется, следующие:
Вы сравниваете индексированные столбцы с постоянными значениями, и MySQL вычислил (на основе дерева индексов), что константы покрывают слишком большую часть таблицы и что сканирование таблицы будет быстрее. См. Раздел 8.2.1.1, "Оптимизация предложения WHERE".
Вы используете ключ с низкой мощностью (многие строки соответствуют значению ключа) через другой столбец. В этом случае MySQL предполагает, что с помощью ключа он, вероятно, будет выполнять многие ключевые поисковые запросы и что сканирование таблицы будет быстрее.
Я предполагаю, что значения category_id недостаточно разрежены
Как я сказал здесь, это
where 'category_id' = '1' and
'subcategory_id' = '2' and
'gender_id' = '1' and
'used' = '0'
order by 'created_at' desc
limit 24 offset 0
требуется составной индекс из 5 столбцов:
INDEX(category_id, subcategory_id, gender_id, used, -- in any order
created_at)
чтобы добраться до значения LIMIT
, тем самым не нужно брать много строк и сортировать их.
Что касается вашего фактического вопроса о том, какой индекс он выбрал... Вероятно, мощность одного неадекватного индекса была лучше, чем у другого.
SHOW CREATE TABLE <name>