Добавление, удаление и переименование индекса
Добавление индекса
ADD INDEX — добавляет индекс с указанным именем и типом для заданного набора колонок в строковых таблицах. Грамматика:
ALTER TABLE `<table_name>`
ADD INDEX `<index_name>`
[GLOBAL|LOCAL]
[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— векторный индекс. Подробнее описан в разделе Векторный индекс.fulltext_plain— базовый полнотекстовый индекс. Подробнее описан в Полнотекстовый индекс.fulltext_relevance— полнотекстовый индекс со статистикой BM25 для расчёта релевантности. Подробнее описан в Полнотекстовый индекс.
-
<index_columns>— список имён колонок создаваемой таблицы через запятую, по которому определяется состав и порядок включения колонок в ключ индекса. Обязательно должен быть указан. Ключ индекса будет состоять из этих колонок с добавлением колонок первичного ключа таблицы. -
<cover_columns>— список имён колонок создаваемой таблицы через запятую, которые будут сохранены в индексе дополнительно к колонкам ключа индекса, давая возможность получить дополнительные данные без обращения за ними в таблицу. По умолчанию пуст. -
<parameter_name>и<parameter_value>— параметры индекса, специфичные для конкретного<index_type>.
Параметры для всех типов индексов:
parallel- максимальное число параллельных обработчиков на основе партиций, задействованных в построении индекса (целое число между1иMaxBuildIndexShardsInFlightизSchemeShardConfig).- Если параметр не указан, сейчас используется значение по умолчанию
32илиMaxBuildIndexShardsInFlight, если это значение меньше.MaxBuildIndexShardsInFlightпо умолчанию равен1000. В будущих версиях логика выбора параллелизма по умолчанию может быть изменена. - Вы можете установить меньший лимит, чтобы снизить влияние построения индекса на производительность базы данных.
- Вы также можете установить больший лимит, чтобы ускорить построение индекса, если у вас достаточно аппаратных ресурсов.
- Если параметр не указан, сейчас используется значение по умолчанию
Параметры, специфичные для векторных индексов:
- общие параметры для всех векторных индексов:
vector_dimension- размерность вектора эмбеддинга (значение от 1 до 16384);vector_type- тип значений вектора (float,uint8илиint8);distance- функция расстояния (cosine,manhattanилиeuclidean), взаимосключающий сsimilarity;similarity- функция схожести (inner_productилиcosine), взаимосключающий сdistance;
- специфичные параметры для
vector_kmeans_tree(подробнее о типе индекса):clusters- количество центроидов для алгоритма k-means (значение от 2 до 2048);levels- количество уровней в дереве (значение от 1 до 16);overlap_clusters- число ближайших кластеров, в которые будет добавлен каждый вектор (по умолчанию 1).- общее количество узлов в дереве, рассчитываемое как
clustersв степениlevels, должно быть не более чем 1073741824; - произведение
vector_dimensionнаclustersдолжно быть не более чем 4194304.
Примечание
Для векторных индексов параметры vector_type и vector_dimension можно не указывать, если таблица не пуста — они определяются автоматически по содержимому строк. Параметры levels и clusters также определяются автоматически, и для них таблица может быть пустой, но делать это крайне не рекоммендуется так как дефолтные значения в этом случае levels=1, clusters=2, гораздо лучше создавать индекс по таблице куда уже загруженны данные, чтобы значения могли правильно определиться.
Параметры, специфичные для полнотекстовых индексов:
- общие параметры для всех полнотекстовых индексов:
tokenizer- тип токенизатора (standard,whitespaceилиkeyword)use_filter_lowercase- фильтр приведения к нижнему регистру (trueилиfalse)use_filter_length- фильтр по длине токена (trueилиfalse); при значенииtrueтокены корочеfilter_length_minили длиннееfilter_length_maxне индексируются и не участвуют в поискеfilter_length_min- минимальная длина токена (положительное целое); применяется только приuse_filter_length=truefilter_length_max- максимальная длина токена (положительное целое); применяется только приuse_filter_length=trueuse_filter_snowball- фильтр стемминга Snowball (trueилиfalse)language- язык для стеммера Snowball (например,english,russian)use_filter_ngram- фильтр N-грамм (trueилиfalse)use_filter_edge_ngram- фильтр краевых N-грамм (trueилиfalse)filter_ngram_min_length- минимальная длина N-граммы (положительное целое)filter_ngram_max_length- максимальная длина N-граммы (положительное целое, (\ge)filter_ngram_min_length)
Также добавить вторичный индекс можно с помощью команды table index YDB CLI.
Важно
Поддерживается только для строковых таблиц. Поддержка функциональности для колоночных таблиц находится в разработке.
Примеры
Вторичный индекс:
ALTER TABLE `series`
ADD INDEX `title_index`
GLOBAL ON (`title`);
ALTER TABLE `series`
ADD INDEX emb_cosine_idx GLOBAL SYNC USING vector_kmeans_tree
ON (embedding) COVER (title)
WITH (
distance="cosine", vector_type="float", vector_dimension=512
);
Полнотекстовый индекс:
ALTER TABLE `series`
ADD INDEX ft_idx GLOBAL USING fulltext_plain
ON (title)
WITH (tokenizer=standard, use_filter_lowercase=true);
Изменение параметров индекса
Индексы имеют параметры, зависящие от типа, которые можно настраивать. Глобальные индексы, синхронные или асинхронные, реализованы в виде скрытых таблиц, и их параметры автоматического партиционирования и реплик можно регулировать так же, как и настройки обычных таблиц.
Примечание
В настоящее время задание настроек партиционирования вторичных индексов при создании индекса не поддерживается ни в операторе 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`;