Структура данных индекса InnoDB MySQL представляет собой дерево B+.Значение конечного узла индекса первичного ключа хранит строку данных MySQL, а значение конечного узла обычного индекса хранит значение первичного ключа, которое должно понимать кластеризованный индекс и некластеризованный индекс.
Что такое кластерный индекс?
Очень просто запомнить одно предложение: если вы найдете индекс, вы найдете необходимые данные, тогда этот индекс является кластеризованным индексом, поэтому первичный ключ является кластеризованным индексом, а изменение кластеризованного индекса фактически является изменением первичного ключа. .
Что такое некластеризованный индекс?
Хранилище индекса и хранилище данных разделены, то есть индекс найден, но данные не найдены, и необходимо снова запросить таблицу в соответствии со значением индекса (первичный ключ). Некластеризованные индексы также называются вспомогательными индексами.
кластерный индекс (официальное объяснение кластерного индекса MySQL)
The InnoDB term for a primary key index, Хранилище таблиц InnoDB организовано на основе значений столбцов первичного ключа, чтобы ускорить запросы и сортировки с использованием столбцов первичного ключа.Для лучшей производительности тщательно выбирайте столбцы первичного ключа на основе наиболее критичных для производительности запросов.Потому что изменение столбцов кластеризованного индекса — дорогостоящая операция, выбирайте первичные столбцы, которые редко или никогда не обновляются. Обратите внимание на выделенный черным абзац, кластеризованный индекс — это термин для первичного ключа
один пример
Ниже мы создаем таблицу учеников и выполняем три вида запросов, чтобы проиллюстрировать, когда это кластеризованный индекс, а когда нет.
create table student (
id bigint,
no varchar(20) ,
name varchar(20) ,
address varchar(20) ,
PRIMARY KEY (`branch_id`) USING BTREE,
UNIQUE KEY `idx_no` (`no`) USING BTREE
)ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
Во-первых, получить все данные поля непосредственно на основе запроса первичного ключа, В настоящее время первичный ключ представляет собой кластеризованный индекс, поскольку конечный узел индекса, соответствующий первичному ключу, хранит значения всех полей с id=1. .
select * from student where id = 1
Во-вторых, запросить номер и имя в соответствии с номером.Сам номер является уникальным индексом, но столбец запроса содержит номер учащегося и имя учащегося.При попадании в числовой индекс данные узла индекса хранится как идентификатор первичного ключа, который необходимо хранить в соответствии с пронумерованным индексом. Идентификатор первичного ключа запрашивается снова, поэтому в этом запросе нет кластеризованного индекса.
select no,name from student where no = 'test'
Третий тип заключается в том, что мы запрашиваем число на основе числа (некоторые люди спросят, известно ли число? Да, вам может потребоваться проверить, существует ли число в базе данных). возвращается напрямую, потому что требуемые данные являются индексом, нет необходимости запрашивать обратно таблицу, в этом сценарии нет кластеризованного индекса.
select no from student where no = 'test'
Суммировать
Первичный ключ должен быть кластеризованным индексом. В базе данных MySQL InnoDB должен быть первичный ключ. Даже если персонал отдела исследований и разработок не установит его вручную, будет использоваться уникальный индекс. Если уникального индекса нет, идентификатор строки в база данных будет использоваться в качестве индекса первичного ключа.Другие общие индексы должны различать сценарии SQL.Когда столбец SQL-запроса является самим индексом, мы называем обычный индекс в этом сценарии, который также называется кластеризованным индексом.Механизм MyisAM не имеет кластерного индекса.