Оптимизация запросов для ВНУТРЕННЕГО СОЕДИНЕНИЯ

#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> , и он должен использовать индекс.