В MySQL, как мы можем сказать, кластеризован ли индекс таблицы или нет?
В MySQL, как мы можем сказать, кластеризован ли индекс таблицы или нет?
Мы можем использовать show index from table-name
получить информацию об индексах таблицы. Но я не нахожу, что это показывает, является ли каждый индекс кластеризованным или некластеризованным.
Это делается для того, чтобы: если таблица в MySQL имеет какой-либо индекс, должна ли таблица иметь кластерный индекс?
1 ответ
В механизме хранения по умолчанию, InnoDB, индекс PRIMARY KEY всегда является кластеризованным индексом.
Если у вас нет PRIMARY KEY, это первый индекс UNIQUE KEY для ненулевых столбцов.
Если у вас нет PRIMARY KEY или UNIQUE KEY для ненулевых столбцов, то InnoDB имеет скрытый кластеризованный индекс. Вы не можете сделать запрос использовать этот кластерный индекс в этом случае.
См. https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html
Если таблица не имеет PRIMARY KEY или подходящего индекса UNIQUE, InnoDB внутренне генерирует скрытый кластеризованный индекс с именем GEN_CLUST_INDEX для синтетического столбца, содержащего значения идентификатора строки. Строки упорядочены по идентификатору, который InnoDB присваивает строкам в такой таблице. Идентификатор строки представляет собой 6-байтовое поле, которое монотонно увеличивается при вставке новых строк. Таким образом, строки, упорядоченные по идентификатору строки, физически находятся в порядке вставки.
MyISAM - другой распространенный механизм хранения. MyISAM не поддерживает кластерный индекс.