У меня есть вопрос о том, как работает кластеризованный индекс в Innodb - PullRequest
1 голос
/ 15 апреля 2020

Когда мы строим индекс, и информация об индексе сохраняется на диске. Но если мы выполним запрос, подобный select, то как будет использоваться индекс. Будет ли индексный файл загружен в ОЗУ или будет использован какой-либо кеш? Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Ваш вопрос, кажется, колеблется между "кластеризованным" и нет. Я попытаюсь объяснить различие и использование каждого из них.

InnoDB PRIMARY KEY "кластеризован" с данными. Существует одно BTree (фактически дерево B +), которое содержит все данные, отсортированные по PK.

Вторичные индексы - это отдельные BTree. Они сортируются по столбцам, указанным для индекса. Листья такого BTree содержат PK, поэтому он может через второй поиск получить доступ ко всей записи.

BTrees составлены из блоков по 16 КБ. Каждый блок содержит несколько строк (Полезное правило: 100 строк. В действительности, от 1 до ~ 1000.)

Блоки загружаются в «буферный пул» по мере необходимости . Весь BTree не предустановлен. SELECTs доступ к данным и информации об индексе только из буфера_була, не с диска. Операции записи могут читать из индекса, чтобы найти блок, в котором вставленная / измененная / удаленная строка находится или должна go. Затем он запрашивает, чтобы блок был извлечен с диска (если он уже не кэширован в buffer_pool) Фоновая задача позаботится о сбросе на диск.

Будучи «кешем», все данные или индекс могут или не полностью находиться в buffer_pool.

См. Википедию для обсуждения BTree и B + Tree.

0 голосов
/ 15 апреля 2020

Индексы Innodb хранятся в innodb_buffer_pool вместе со всеми другими страницами данных innodb.

Чтобы проверить использование индекса в запросе, посмотрите на вывод EXPLAIN {query}.

...