Сканирует ли InnoDB вторичный индекс и извлекает одну за другой записи, которые попадают в условие?
Если вы выбираете столбцы, не охватываемые вторичным индексом, то да, он должен извлечь их изтаблица (кластеризованный индекс).
Если у вас есть такая раскладка:
CREATE TABLE a (id INT NOT NULL PRIMARY KEY, ca INT NOT NULL, cb INT NOT NULL, KEY(ca))
SELECT cb
FROM a
WHERE ca = $some_value
происходит следующее:
Использование B-Tree seek
,InnoDB
находит первую запись в индексе на ca
, которая содержит $some_value
Затем он проходит по индексу, беря записи по одной, пока не найдет первую запись большейчем $some_value
.
Поскольку в индексе содержатся только ca
(ключевой столбец) и id
(указатель строки), InnoDB
необходимо найти значения cb
в самой таблице.
Для каждой записи в индексе он принимает значение id
и ищет его в таблице.Поскольку таблица на самом деле является кластеризованным индексом для id
, для этого используется поиск B-Tree
.
Однако, если у вас есть этот запрос:
SELECT ca, id
FROM a
WHERE ca = $some_value
, тогда все можно получить прямо из индекса, а шаги 3
и 4
не выполняются.Он отображается в плане запроса как using index
.
Если у меня 50 совпадений во вторичном индексе, InnoDB будет искать 50-кратный первичный индекс?
Да (в отношениикомментарий выше)