#mysql #indexing
#mysql #индексирование
Вопрос:
У меня есть этот запрос ниже:
SELECT a.id, b.item_name
FROM table_1 as a
INNER JOIN table_2 as b on a.item_id = b.item_id
Существует индекс a.bid
как основной, и индекс включен a.item_id
, и есть индекс включен b.item_id
как основной, и индекс включен b.item_name
Однако, когда я запускаю запрос через EXPLAIN
основную таблицу, она становится таблицей_1, и индекс не используется, поэтому выполняется полное сканирование. Почему бы ему не присоединиться к индексу для b.item_id?
Комментарии:
1. Что ОБЪЯСНЯЕТ вывод, когда вы переписываете запрос как —
SELECT a.id,b.item_name FROM table_1 as a, table_2 as b where a.item_id = b.item_id
?2. Пожалуйста, всегда публикуйте полный вывод explain. Это намного точнее, чем пытаться описать это на английском языке.
Ответ №1:
Необходимо выполнить полное сканирование хотя бы одной таблицы, поскольку вы запрашиваете все записи. Похоже, он выбрал table_1. Индекс должен использоваться для таблицы_2.
Если вы дополнительно добавите предложение where, вы можете избежать этого сканирования таблицы. Но если вам действительно нужны все строки, то сканирование — самый быстрый способ их получить.
Ответ №2:
Он выполняет сканирование таблицы, потому что вы запрашиваете все совпадающие строки. Добавьте a WHERE a.id = <any id>
, и он должен использовать индекс.