Добавление, удаление и переименование индекса
Внимание
Поддерживается только для строковых таблиц. Поддержка функциональности для колоночных таблиц находится в разработке.
Внимание
Фукциональность векторных индексов доступна, начиная с версии 25.1.2
.
Для включения векторных индексов необходимо установить значение feature flag enable_vector_index
в true
.
В настоящее время не поддерживается:
- Обновление индекса: модифицировать основную таблицу можно, но существующий индекс не обновится. Нужно построить новый индекс, чтобы учесть изменения. При необходимости, можно атомарно заменить существующий индекс на вновь построенный.
- Построение индекса для векторов c битовым квантованием.
Эти ограничения могут быть устранены в будущих версиях.
Добавление индекса
ADD INDEX
— добавляет индекс с указанным именем и типом для заданного набора колонок в строковых таблицах. Грамматика:
ALTER TABLE `<table_name>`
ADD INDEX `<index_name>`
[GLOBAL|LOCAL]
[UNIQUE]
[SYNC|ASYNC]
[USING <index_type>]
ON ( <index_columns> )
[COVER ( <cover_columns> )]
[WITH ( <parameter_name> = <parameter_value>[, ...])]
[, ...]
-
GLOBAL/LOCAL
— глобальный или локальный индекс, в зависимости от типа индекса (<index_type>
) может быть доступен только один из них:GLOBAL
— индекс, реализованный в виде отдельной таблицы или набора таблиц. Синхронное обновление такого индекса требует распределённых транзакций.LOCAL
— локальный индекс в рамках шарда колоночной или строковой таблицы, не требует распределённых транзакций при обновлении, однако не обеспечивает прюнинг при поиске.
-
<index_name>
— уникальное имя индекса, по которому будет возможно обращение к данным. -
SYNC/ASYNC
— синхронная или асинхронная запись в индекс. По умолчанию синхронная. -
<index_type>
- тип индекса, в настоящее время поддерживаются:secondary
— вторичный индекс. Доступен толькоGLOBAL
. Является значением по умолчанию.vector_kmeans_tree
— векторный индекс. Подробнее описан в Векторный индекс.
-
UNIQUE
— создаёт индекс с гарантией уникальности для вставляемых значений. -
<index_columns>
— список имён колонок создаваемой таблицы через запятую, по которым возможен поиск в индексе. Обязательно должен быть указан. -
<cover_columns>
— список имён колонок создаваемой таблицы через запятую, которые будут сохранены в индексе дополнительно к колонкам поиска, давая возможность получить дополнительные данные без обращения за ними в таблицу. По умолчанию пуст. -
<parameter_name>
и<parameter_value>
— параметры индекса, специфичные для конкретного<index_type>
.
Параметры, специфичные для векторных индексов:
- общие параметры для всех векторных индексов:
vector_dimension
- размерность вектора эмбеддинга (16384 или меньше);vector_type
- тип значений вектора (float
,uint8
,int8
илиbit
);distance
- функция расстояния (cosine
,manhattan
илиeuclidean
), взаимосключающий сsimilarity
;similarity
- функция схожести (inner_product
илиcosine
), взаимосключающий сdistance
;
- специфичные параметры для
vector_kmeans_tree
(см. Векторный индекс типа `vector_kmeans_tree` {#kmeans-tree-type}):clusters
- количество центроидов для алгоритма k-means (значения более 1000 могут ухудшить производительность);levels
- количество уровней в дереве;
Также добавить вторичный индекс можно с помощью команды table index YDB CLI.
Примеры
Вторичный индекс:
ALTER TABLE `series`
ADD INDEX `title_index`
GLOBAL ON (`title`);
Векторный индекс:
ALTER TABLE `series`
INDEX emb_cosine_idx GLOBAL SYNC USING vector_kmeans_tree
ON (embedding) COVER (title)
WITH (
distance="cosine",
vector_type="float",
vector_dimension=512,
clusters=128,
levels=2
);
Изменение параметров индекса
Индексы имеют параметры, зависящие от типа, которые можно настраивать. Глобальные индексы, синхронные или асинхронные, реализованы в виде скрытых таблиц, и их параметры автоматического партиционирования и реплик можно регулировать так же, как и настройки обычных таблиц.
Примечание
В настоящее время задание настроек партиционирования вторичных индексов при создании индекса не поддерживается ни в операторе ALTER TABLE ADD INDEX
, ни в операторе CREATE TABLE INDEX
.
ALTER TABLE <table_name> ALTER INDEX <index_name> SET <setting_name> <value>;
ALTER TABLE <table_name> ALTER INDEX <index_name> SET (<setting_name_1> = <value_1>, ...);
-
<table_name>
- имя таблицы, индекс которой нужно изменить. -
<index_name>
- имя индекса, который нужно изменить. -
<setting_name>
- имя изменяемого параметра, который должен быть одним из следующих:
Примечание
Эти настройки нельзя вернуть к исходным.
-
<value>
- новое значение параметра. Возможные значения включают:ENABLED
илиDISABLED
для параметровAUTO_PARTITIONING_BY_SIZE
иAUTO_PARTITIONING_BY_LOAD
"PER_AZ:<count>"
или"ANY_AZ:<count>"
где<count>
— число реплик дляREAD_REPLICAS_SETTINGS
- для остальных параметров — целое число типа
Uint64
Пример
Код из следующего примера включает автоматическое партиционирование по нагрузке для индекса с именем title_index
в таблице series
, устанавливает минимальное количество партиций равным 5 и запускает по одной реплике в каждой зоне доступности (AZ) для каждой партиции:
ALTER TABLE `series` ALTER INDEX `title_index` SET (
AUTO_PARTITIONING_BY_LOAD = ENABLED,
AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 5,
READ_REPLICAS_SETTINGS = "PER_AZ:1"
);
Удаление индекса
DROP INDEX
— удаляет индекс с указанным именем. Приведенный ниже код удалит индекс с именем title_index
.
ALTER TABLE `series` DROP INDEX `title_index`;
Также удалить индекс можно с помощью команды table index YDB CLI.
Переименование вторичного индекса
RENAME INDEX
— переименовывает индекс с указанным именем. Если индекс с новым именем существует, будет возвращена ошибка.
Возможность атомарной замены индекса под нагрузкой поддерживается командой ydb table index rename YDB CLI и специализированными методами YDB SDK.
Пример переименования индекса:
ALTER TABLE `series` RENAME INDEX `title_index` TO `title_index_new`;