Mysql индекс нескольких столбцов с использованием неправильного индекса

0

У меня есть индексы по таблице продуктов:

  1. ПЕРВИЧНЫЙ
  2. products_gender_id_foreign
  3. products_subcategory_id_foreign
  4. idx_products_cat_subcat_gender_used (индекс нескольких столбцов)

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

  • 5
    Кажется, у вас очень мало строк, поэтому конкретный индекс не имеет значения.
  • 3
    Любой вопрос по оптимизации запроса должен включать вывод команды SHOW CREATE TABLE <name>
Показать ещё 4 комментария
Теги:
optimization
indexing
query-optimization

2 ответа

2

Как поясняется в документации MySQL, индекс может быть проигнорирован в некоторых случаях. Те, которые могут применяться в вашем случае, поскольку один из индексов уже используется, следующие:

  • Вы сравниваете индексированные столбцы с постоянными значениями, и MySQL вычислил (на основе дерева индексов), что константы покрывают слишком большую часть таблицы и что сканирование таблицы будет быстрее. См. Раздел 8.2.1.1, "Оптимизация предложения WHERE".

  • Вы используете ключ с низкой мощностью (многие строки соответствуют значению ключа) через другой столбец. В этом случае MySQL предполагает, что с помощью ключа он, вероятно, будет выполнять многие ключевые поисковые запросы и что сканирование таблицы будет быстрее.

Я предполагаю, что значения category_id недостаточно разрежены

1

Как я сказал здесь, это

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, тем самым не нужно брать много строк и сортировать их.

Что касается вашего фактического вопроса о том, какой индекс он выбрал... Вероятно, мощность одного неадекватного индекса была лучше, чем у другого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню