Добавление, удаление и переименование индекса

Внимание

Поддерживается только для строковых таблиц. Поддержка функциональности для колоночных таблиц находится в разработке.

Внимание

Фукциональность векторных индексов доступна, начиная с версии 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>, ...);

Примечание

Эти настройки нельзя вернуть к исходным.

  • <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`;
Предыдущая
Следующая