Индекс внешнего ключа MySql - PullRequest
1 голос
/ 09 июня 2009

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

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

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

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

Но когда я запускаю EXPLAIN SELECT * из продуктов, где category_id IN (1,10);

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

Как ни странно, когда я делаю EXPLAIN SELECT * из продуктов, где category_id IN (1,2); Используются диапазон типов и ключ: My_foreign_key!

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

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

Спасибо

1 Ответ

4 голосов
/ 09 июня 2009

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

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

...