Индекс внешнего ключа MySql

Я использую продукты таблицы Mysql, у которых есть внешний ключ category_id в таблице категорий.

ограничение внешнего ключа определено (механизм Innodb).

Я заметил, что когда я запускаю EXPLAIN SELECT * из продуктов, где category_id=1;

он использует внешний ключ, поэтому я вижу type=Range and Key: my_foreign_key

Но когда я запускаю EXPLAIN SELECT * from products where category_id IN (1,10);

он использует полное сканирование таблицы: type=ALL, Key:NULL!!!

По иронии судьбы, когда я делаю EXPLAIN SELECT * from products where category_id IN (1,2); Он использует диапазон типов и ключ: My_foreign_key!

Поэтому я предполагаю, что есть проблема, когда category_id использует значения, которые не являются смежными.

Есть идеи, почему?

Спасибо


person youyou    schedule 09.06.2009    source источник


Ответы (1)


Это одна из форм вечного вопроса «почему MySQL перестает использовать индексы, когда моя таблица становится большой?» По сути, есть момент, после которого использование индексов перестает быть полезным и начинает вредить вашему запросу, и оптимизатор запросов MySQL разработан с учетом этого. Если вы не верите, вы можете использовать FORCE INDEX, чтобы заставить использовать определенный индекс, выполнить запрос с индексом и без него и посмотреть, какие результаты вы получите.

Разница в поведении с (1,2) и (1,10), вероятно, связана с тем, что категория 2 используется гораздо интенсивнее, чем категория 10.

person chaos    schedule 09.06.2009
comment
Это правильно, я думаю, что этот термин называется ключевой кардинальностью. Например, если 90 % ваших строк имеют category_id = 1, а 10 % ваших строк — category_id = 2, то больше не нужно будет использовать ключ category_id. (фактические числа составлены, я не верю, что существует жесткое и быстрое правило, когда mysql перестает использовать ваш ключ). - person Hardwareguy; 09.06.2009