Дайте мне минуту, чтобы полностью понять кластеризованные и некластеризованные индексы MySQL.

MySQL

Структура данных индекса 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 не имеет кластерного индекса.