Как вторичное сканирование индекса работает в InnoDB? - PullRequest
4 голосов
/ 22 января 2011

InnoDB имеет два типа индексов: первичный (кластеризованный) и вторичный (с ключом индекса pimary).

Когда я набираю запрос, который сканирует поля, проиндексированные вторичным индексом, мой вопрос начинается.InnoDB сканирует вторичный индекс и извлекает одну за другой записи, которые попадают в условие?Если у меня 50 попаданий во вторичном индексе, InnoDB будет искать 50-кратный первичный индекс?

1 Ответ

12 голосов
/ 22 января 2011

Сканирует ли 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

происходит следующее:

  1. Использование B-Tree seek,InnoDB находит первую запись в индексе на ca, которая содержит $some_value

  2. Затем он проходит по индексу, беря записи по одной, пока не найдет первую запись большейчем $some_value.

  3. Поскольку в индексе содержатся только ca (ключевой столбец) и id (указатель строки), InnoDB необходимо найти значения cb в самой таблице.

  4. Для каждой записи в индексе он принимает значение id и ищет его в таблице.Поскольку таблица на самом деле является кластеризованным индексом для id, для этого используется поиск B-Tree.

Однако, если у вас есть этот запрос:

SELECT  ca, id
FROM    a
WHERE   ca = $some_value

, тогда все можно получить прямо из индекса, а шаги 3 и 4 не выполняются.Он отображается в плане запроса как using index.

Если у меня 50 совпадений во вторичном индексе, InnoDB будет искать 50-кратный первичный индекс?

Да (в отношениикомментарий выше)

...