13.1.14 Оператор CREATE INDEX
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
[index_type]
ON tbl_name (key_part,...)
[index_option]
[algorithm_option | lock_option] ...
key_part:
col_name [(length)] [ASC | DESC]
index_option: {
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
}
index_type:
USING {BTREE | HASH}
algorithm_option:
ALGORITHM [=] {DEFAULT | INPLACE | COPY}
lock_option:
LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
Обычно все индексы на таблице создаются в момент создания самой таблицы с помощью CREATE
TABLE. См. Раздел 13.1.18, «Оператор CREATE TABLE». Это правило особенно важно для таблиц InnoDB, где первичный ключ определяет физическое расположение строк в файле данных. CREATE INDEX позволяет добавить индексы к существующим таблицам.
CREATE INDEX отображается как оператор ALTER TABLE для создания индексов. См. Раздел 13.1.8, «Оператор ALTER TABLE». CREATE INDEX нельзя использовать для создания PRIMARY KEY; используйте ALTER TABLE вместо этого. Дополнительную информацию об индексах см. в Разделе 8.3.1, «Как MySQL использует индексы».
InnoDB поддерживает вторичные индексы на виртуальных столбцах. Дополнительную информацию см. в Разделе 13.1.18.8, «Вторичные индексы и сгенерированные столбцы».
При включенной настройке innodb_stats_persistent запустите оператор ANALYZE
TABLE для таблицы InnoDB после создания индекса в этой таблице.
Спецификация индекса в форме ( создает индекс с несколькими ключевыми частями. Значения ключа индекса формируются путем конкатенации значений заданных ключевых частей. Например, key_part1,
key_part2, ...)(col1, col2, col3) задает индекс по нескольким столбцам с ключами индекса, состоящими из значений из col1, col2 и col3.
Спецификация key_part может заканчиваться ASC или DESC. Эти ключевые слова разрешены для будущих расширений для указания хранения значений индекса по возрастанию или убыванию. В настоящее время они анализируются, но игнорируются; значения индексов всегда хранятся в порядке возрастания.
В следующих разделах описываются различные аспекты оператора CREATE INDEX:
Ключевые части префиксов столбцов
Для строковых столбцов можно создать индексы, использующие только начальную часть значений столбца, используя синтаксис для указания длины префикса индекса: col_name(length)
Префиксы могут быть указаны для
CHAR,VARCHAR,BINARYиVARBINARYключевых частей.-
Префиксы обязательны для
BLOBиTEXTключевых частей. Кроме того, столбцыBLOBиTEXTмогут быть индексированы только для таблицInnoDB,MyISAMиBLACKHOLE. -
Префиксные пределы измеряются в байтах. Однако, префиксные длины для спецификаций индексов в операторах
CREATE TABLE,ALTER TABLEиCREATE INDEXинтерпретируются как количество символов для небинарных строковых типов (CHAR,VARCHAR,TEXT) и количество байтов для бинарных строковых типов (BINARY,VARBINARY,BLOB). Учитывайте это при указании длины префикса для небинарного строкового столбца, использующего многобайтовую кодировку символов.Поддержка префиксов и длина префиксов (где поддерживается) зависят от типа хранилища. Например, для таблиц
InnoDBпрефикс может быть длиной до 767 байт или 3072 байта, если включен параметрinnodb_large_prefix. Для таблицMyISAMпрефиксная длина ограничена 1000 байтами. ДвигательNDBне поддерживает префиксы (см. Раздел 21.2.7.6, «Неподдерживаемые или отсутствующие функции в NDB Cluster»).
Начиная с MySQL 5.7.17, если указанный префикс индекса превышает максимальный размер данных типа столбца, CREATE
INDEX обрабатывает индекс следующим образом:
Для неуникального индекса либо возникает ошибка (если включен строгий режим SQL), либо длина индекса уменьшается до соответствия максимальному размеру данных типа столбца, и генерируется предупреждение (если строгий режим SQL не включен).
Для уникального индекса возникает ошибка независимо от режима SQL, поскольку уменьшение длины индекса может позволить вставку не уникальных записей, которые не соответствуют требованиям уникальности.
Приведенный здесь оператор создает индекс, используя первые 10 символов столбца name (предполагается, что name имеет небинарный строковый тип):
CREATE INDEX part_of_name ON customer (name(10));
Если имена в столбце обычно отличаются по первым 10 символам, поиск с использованием этого индекса не должен быть намного медленнее, чем поиск с использованием индекса, созданного по всему столбцу name. Кроме того, использование префиксов столбцов для индексов может значительно уменьшить файл индекса, что может сэкономить значительное дисковое пространство и ускорить операции INSERT.
Уникальные индексы
Индекс UNIQUE создает ограничение, такое что все значения в индексе должны быть уникальными. Возникает ошибка, если вы пытаетесь добавить новую строку со значением ключа, совпадающим с существующей строкой. Если вы указываете значение префикса для столбца в уникальном индексе, значения столбца должны быть уникальными в пределах длины префикса. Индекс UNIQUE допускает несколько значений NULL для столбцов, которые могут содержать NULL.
Если в таблице есть индекс PRIMARY KEY или UNIQUE NOT NULL, состоящий из одного столбца целого типа, вы можете использовать _rowid для ссылки на индексированный столбец в операторах SELECT следующим образом:
_rowidссылается на столбецPRIMARY KEY, если есть индексPRIMARY KEY, состоящий из одного целого столбца. Если есть индексPRIMARY KEY, но он не состоит из одного целого столбца,_rowidнельзя использовать.В противном случае,
_rowidссылается на столбец в первом индексеUNIQUE NOT NULL, если этот индекс состоит из одного целого столбца. Если первый индексUNIQUE NOT NULLне состоит из одного целого столбца,_rowidнельзя использовать.
Индексы полнотекстового поиска
Индексы полнотекстового поиска поддерживаются только для таблиц InnoDB и MyISAM и могут включать только столбцы типа CHAR, VARCHAR и BLOB. Индексация всегда выполняется по всему столбцу; индексация по префиксу столбца не поддерживается, и любой заданный префикс будет игнорироваться. Подробности работы см. в разделе 12.9 «Функции полнотекстового поиска».
Пространственные индексы
Двигатели MyISAM, InnoDB, NDB Cluster и ARCHIVE поддерживают пространственные столбцы, такие как POINT и POLYGON. (Раздел 11.4, «Пространственные типы данных» описывает пространственные типы данных.) Однако поддержка пространственной индексации столбцов различается между движками. Пространственные и непространственные индексы по пространственным столбцам доступны в соответствии со следующими правилами.
Пространственные индексы на пространственных столбцах (созданные с помощью SPATIAL INDEX) имеют следующие характеристики:
Непространственные индексы на пространственных столбцах (созданные с помощью INDEX, UNIQUE или PRIMARY KEY) имеют следующие характеристики:
Разрешены для любого движка, поддерживающего пространственные столбцы, за исключением ARCHIVE.
Столбцы могут быть
NULL, если индекс не является первичным ключом.Для каждого пространственного столбца в индексе, не являющимся
SPATIAL, за исключением столбцов типа POINT, должна быть указана длина префикса столбца. (Это то же требование, что и для индексированных столбцов типа BLOB.) Длина префикса указывается в байтах.Тип индекса для непространственного индекса зависит от движка. В настоящее время используется B-дерево.
Разрешены для столбца, который может содержать значения
NULLтолько для таблиц InnoDB, MyISAM и MEMORY.
Параметры индексов
После списка ключей можно указать параметры индекса. Значение index_option может быть любым из следующих:
-
KEY_BLOCK_SIZE [=]valueДля таблиц MyISAM,
KEY_BLOCK_SIZEнеобязательно задаёт размер в байтах для использования блоков ключа индекса. Это значение рассматривается как подсказка; при необходимости может быть использован другой размер. ЗначениеKEY_BLOCK_SIZE, заданное для отдельного определения индекса, переопределяет значениеKEY_BLOCK_SIZEна уровне таблицы.KEY_BLOCK_SIZEне поддерживается на уровне индекса для таблиц InnoDB. См. раздел 13.1.18 «Команда CREATE TABLE».
-
index_typeНекоторые движки хранения позволяют указать тип индекса при создании индекса. Например:
CREATE TABLE lookup (id INT) ENGINE = MEMORY; CREATE INDEX id_index ON lookup (id) USING BTREE;
Таблица 13.1, “Типы индексов по движкам хранения” показывает допустимые значения типа индекса, поддерживаемые различными движками хранения. В случае нескольких типов индексов, первый является значением по умолчанию, когда указатель типа индекса отсутствует. Движки хранения, не указанные в таблице, не поддерживают предложение
index_typeв определениях индексов.Таблица 13.1 Типы индексов по движкам хранения
Предложение
index_typeне может быть использовано для спецификацийFULLTEXT INDEXилиSPATIAL INDEX. Реализация индексов полнотекстового поиска зависит от движка хранения. Пространственные индексы реализуются как индексы R-дерева.Индексы
BTREEреализуются движком храненияNDBкак индексы T-дерева.ПримечаниеДля индексов на столбцах таблиц
NDBпараметрUSINGможет быть указан только для уникального индекса или первичного ключа.USING HASHпредотвращает создание упорядоченного индекса; в противном случае создание уникального индекса или первичного ключа на таблицеNDBавтоматически приводит к созданию как упорядоченного индекса, так и хеш-индекса, каждый из которых индексирует тот же набор столбцов.Для уникальных индексов, включающих один или несколько столбцов
NULLтаблицыNDB, хеш-индекс может быть использован только для поиска литеральных значений, что означает, что условияIS [NOT] NULLтребуют полного сканирования таблицы. Одним из решений является обеспечение того, чтобы уникальный индекс, использующий один или несколько столбцовNULLв такой таблице, всегда создавался таким образом, чтобы он включал упорядоченный индекс; то есть, избегайте использованияUSING HASHпри создании индекса.Если вы укажете тип индекса, который не допустим для данного движка хранения, но доступен другой тип индекса, который движок может использовать без изменения результатов запросов, движок использует доступный тип. Парсер распознаёт
RTREEкак имя типа, но в настоящее время это нельзя указать для любого движка хранения.ПримечаниеИспользование параметра
index_typeперед предложениемONустарело; ожидается, что поддержка использования параметра в этом месте будет удалена в будущей версии MySQL. Если параметрtbl_nameindex_typeуказан как в более ранних, так и в более поздних позициях, применяется последний параметр.TYPEраспознаётся как синоним дляtype_nameUSING. Однако,type_nameUSINGявляется предпочтительной формой.Следующие таблицы показывают характеристики индексов для движков хранения, поддерживающих параметр
index_type.Таблица 13.2 Характеристики индексов InnoDB движка хранения
Таблица 13.2 Характеристики индексов InnoDB движка хранения Класс индекса Тип индекса Сохраняет значения NULL Разрешает несколько значений NULL Тип сканирования IS NULL Тип сканирования IS NOT NULL Первичный ключ BTREEНет Нет N/A N/A Уникальный BTREEДа Да Индекс Индекс Ключ BTREEДа Да Индекс Индекс FULLTEXTN/A Да Да Таблица Таблица SPATIALN/A Нет Нет N/A N/A Таблица 13.3 Характеристики индексов MyISAM движка хранения
Таблица 13.3 Характеристики индексов MyISAM движка хранения Класс индекса Тип индекса Сохраняет значения NULL Разрешает несколько значений NULL Тип сканирования IS NULL Тип сканирования IS NOT NULL Первичный ключ BTREEНет Нет N/A N/A Уникальный BTREEДа Да Индекс Индекс Ключ BTREEДа Да Индекс Индекс FULLTEXTN/A Да Да Таблица Таблица SPATIALN/A Нет Нет N/A N/A Таблица 13.4 Характеристики индексов MEMORY движка хранения
Таблица 13.4 Характеристики индексов MEMORY движка хранения Класс индекса Тип индекса Сохраняет значения NULL Разрешает несколько значений NULL Тип сканирования IS NULL Тип сканирования IS NOT NULL Первичный ключ BTREEНет Нет N/A N/A Уникальный BTREEДа Да Индекс Индекс Ключ BTREEДа Да Индекс Индекс Первичный ключ HASHНет Нет N/A N/A Уникальный HASHДа Да Индекс Индекс Ключ HASHДа Да Индекс Индекс Таблица 13.5 Характеристики индексов NDB движка хранения
Таблица 13.5 Характеристики индексов NDB движка хранения Класс индекса Тип индекса Сохраняет значения NULL Разрешает несколько значений NULL Тип сканирования IS NULL Тип сканирования IS NOT NULL Первичный ключ BTREEНет Нет Индекс Индекс Уникальный BTREEДа Да Индекс Индекс Ключ BTREEДа Да Индекс Индекс Первичный ключ HASHНет Нет Таблица (см. примечание 1) Таблица (см. примечание 1) Уникальный HASHДа Да Таблица (см. примечание 1) Таблица (см. примечание 1) Ключ HASHДа Да Таблица (см. примечание 1) Таблица (см. примечание 1) Примечание к таблице:
1. Если
USING HASHуказано, это предотвращает создание неявного упорядоченного индекса.
-
WITH PARSERparser_nameЭтот параметр можно использовать только с
FULLTEXTиндексами. Он связывает плагин анализатора с индексом, если для операций полнотекстового индексирования и поиска требуется специальная обработка.InnoDBиMyISAMподдерживают плагины анализатора полнотекстового поиска. Если у вас есть таблицаMyISAMс связанным плагином анализатора полнотекстового поиска, вы можете преобразовать таблицу вInnoDB, используяALTER TABLE. Дополнительную информацию см. в разделах Плагины анализатора полнотекстового поиска и Создание плагинов анализатора полнотекстового поиска. -
COMMENT 'string'Определения индексов могут включать необязательный комментарий длиной до 1024 символов.
Порог слияния страниц индекса можно настроить для отдельных индексов, используя предложение
index_optionCOMMENTоператораCREATE INDEX. Например:CREATE TABLE t1 (id INT); CREATE INDEX id_index ON t1 (id) COMMENT 'MERGE_THRESHOLD=40';
Если процент заполнения страницы индекса для страницы индекса становится ниже значения
MERGE_THRESHOLDпри удалении строки или при сокращении строки операцией обновления,InnoDBпытается объединить страницу индекса с соседней страницей индекса. Значение по умолчанию дляMERGE_THRESHOLDравно 50, что является ранее заданным значением.MERGE_THRESHOLDтакже можно определить на уровне индекса и на уровне таблицы, используя операторыCREATE TABLEиALTER TABLE. Дополнительную информацию см. в разделе 14.8.12 «Настройка порога слияния страниц индекса».
Параметры копирования таблиц и блокировки
Определения ALGORITHM и LOCK могут быть указаны для влияния на метод копирования таблицы и уровень параллельности чтения и записи таблицы во время модификации ее индексов. Они имеют такое же значение, как и для оператора ALTER TABLE. Дополнительную информацию см. в разделе 13.1.8 «Оператор ALTER TABLE»
NDB Cluster ранее поддерживал операции по онлайн-CREATE
INDEX с использованием альтернативной синтаксической конструкции, которая больше не поддерживается. NDB Cluster теперь поддерживает онлайн-операции с использованием того же ALGORITHM=INPLACE синтаксиса, что и в стандартном MySQL Server. Дополнительную информацию см. в разделе 21.6.12 «Онлайн-операции с ALTER TABLE в NDB Cluster».
© 2025 Oracle
Licensed under the GPLv2 License.