Подтвердить что ты не робот

MySQL EXPLAIN: "Использование индекса" против "Использование условия индекса"

Документация MySQL 5.4 по оптимизации запросов с помощью EXPLAIN говорит об этих дополнительных замечаниях:

  • Использование индекса

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

[...]

  • Использование условия индекса

Таблицы читаются путем доступа к индексу кортежи и сначала их тестирование определить, следует ли читать полный стол строк. Таким образом, информация индекса используется для отсрочки ( "нажимать" ) полные строки таблицы, если это не необходимо.

Я что-то упускаю, или эти два означают одно и то же (т.е. "не читал строку, индекс был достаточно" )?

4b9b3361

Ответ 1

Пример объясняет это лучше всего:

SELECT Year, Make --- possibly more fields and/or from extra tables
FROM myUsedCarInventory
WHERE Make = 'Toyota' AND Year > '2006'

Assuming the Available indexes are:
  CarId
  VIN
  Make
  Make and Year

Этот запрос будет EXPLAIN с помощью "Использование индекса", потому что вовсе не нужно "ударять" таблицу myUsedCarInventory, так как индекс "Make and Year" "покрывает" его потребность в отношении элементов WHERE, относящееся к этой таблице.

Теперь, представьте, мы сохраняем запрос одинаковым, но для добавления условия к цвету

...
WHERE Make = 'Toyota' AND Year > '2006' AND Color = 'Red'

Этот запрос, скорее всего, будет EXPLAIN с помощью "Использование условия индекса" ( "вероятно", здесь для случая, когда Toyota + год не будет оцениваться как достаточно избирательный, и оптимизатор может решить просто сканировать таблицу). Это означало бы, что MySQL FIRST будет использовать индекс для разрешения Make + Year, и ему придется искать соответствующую строку в таблице, а только для строк, которые удовлетворяют условиям Make + Year, Это то, что иногда называют " оптимизировать нажатие.

Ответ 2

Разница заключается в том, что "Использование индекса" не нуждается в поиске из индекса в таблицу, а иногда "Использовать условие индекса". Я попытаюсь проиллюстрировать это на примере. Скажем, у вас есть эта таблица:

id, name, location

С индексом на

name, id

Затем этот запрос не нуждается в таблице ни для чего, он может получить всю информацию "Использование индекса":

select id, name from table where name = 'Piskvor'

Но для этого запроса нужен поиск в таблице для всех строк, где имя равно "Piskvor", поскольку оно не может получить местоположение из индекса:

select id from table where name = 'Piskvor' and location = 'North Pole'

Запрос по-прежнему может использовать индекс, чтобы ограничить результаты небольшими наборами строк с определенным именем, но он должен посмотреть на эти строки в таблице, чтобы проверить, совпадает ли местоположение.