Добавление, удаление и переименование индекса
Внимание
Поддерживается только для строковых таблиц. Поддержка функциональности для колоночных таблиц находится в разработке.
Внимание
В настоящее время не поддерживается:
- Обновление векторного индекса: модифицировать основную таблицу можно, но существующий векторный индекс не обновится. Нужно построить новый индекс, чтобы учесть изменения. При необходимости, можно атомарно заменить существующий индекс на вновь построенный.
- Построение индекса для векторов 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— признак синхронности индекса.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`;