Вторичные индексы

В YDB автоматически создается индекс по первичному ключу, поэтому выборки с условием по первичному ключу всегда выполняются эффективно, затрагивая только требуемые строки. Выборка с условием, наложенным на одну или несколько неключевых колонок, как правило, приводит к полному сканированию таблицы. Для того чтобы такие выборки были эффективными, нужно использовать вторичные индексы.

В текущей версии YDB реализованы синхронные и асинхронные глобальные вторичные индексы. Каждый индекс представляет собой скрытую таблицу, которая обновляется:

  • для синхронных индексов — транзакционно при изменении основной таблицы;
  • для асинхронных индексов — в фоне, получая необходимые изменения из основной таблицы.

Когда пользователь присылает SQL-запрос на вставку, изменение или удаление данных, БД прозрачно для пользователя формирует команды на изменение индексной таблицы. У таблицы может быть несколько вторичных индексов. Индекс может включать несколько колонок, при этом важен порядок указания колонок в индексе. Одна колонка может быть включена в нескольких индексов. В дополнение к указанным колонкам в индексе всегда неявно сохраняются значения колонок первичного ключа таблицы, чтобы от найденной записи в индексе можно было перейти к записи в таблице.

Синхронный вторичный индекс

Синхронный индекс обновляется одновременно с таблицей, которую он индексирует. Такой индекс обеспечивает строгую согласованность данных и использует для этого механизм распределенных транзакций. Таким образом, если операции чтения и слепой записи в таблицу без индекса можно выполнить без стадии планирования, и за счет этого существенно сократить задержки, то для записи в таблицу с синхронным индексом такая оптимизация невозможна.

Асинхронный вторичный индекс

Асинхронный индекс, в отличие от синхронного, не использует механизм распределенных транзакций, а в фоне получает изменения из индексируемой таблицы. Транзакции записи в таблицу с таким индексом выполняются без дополнительных затрат на планирование, за счет снижения гарантий: асинхронный индекс обеспечивает согласованность данных в конечном счете, но не строгую согласованность. Использование асинхронного индекса в транзакциях чтения возможно только в режиме Stale Read Only.

Покрывающий вторичный индекс

Имеется возможность сделать копию содержимого колонок в индекс (covering index), таким образом это исключает необходимость чтения из основной таблицы в операциях чтения по индексу, что заметно снижает задержки. В то же время такая денормализация приводит к увеличенному потреблению дискового пространства и к возможному замедлению операции вставки и обновления из-за необходимости дополнительного копирования данных.

Уникальный вторичный индекс

Этот тип индекса реализует семантику уникального значения в колонке или наборе колонок, а также, как и другие индексы, позволяет эффективно выполнять точечные чтения по набору индексируемых колонок. YDB использует его для выполнения дополнительных проверок, чтобы гарантировать, что каждое уникальное значение индексируемых колонок присутствует в таблице не более одного раза. Если модифицирующий запрос нарушает это ограничение, он будет отменён со статусом PRECONDITION_FAILED. Таким образом, пользовательский код должен быть готов к обработке этого статуса.

Уникальный вторичный индекс является синхронным индексом, поэтому процесс обновления происходит так же, как описано в разделе Синхронный вторичный с точки зрения транзакции.

Ограничения

В настоящее время уникальный индекс не может быть добавлен в существующую таблицу.

Онлайн-создание вторичного индекса

В YDB доступно создание вторичного индекса, а также удаление существующего вторичного индекса без остановки обслуживания. Для одной таблицы можно создать только один индекс за раз.

Операция онлайн-создания индекса состоит из следующих шагов:

  1. Взятие снапшота таблицы с данными, создание таблицы индекса с пометкой доступности для записи.

    После этого шага пишущие транзакции становятся распределенными, происходит запись в основную таблицу и индекс. Для пользователя индекс пока не доступен.

  2. Чтение снапшота основной таблицы и запись в индекс.

    Реализуется «запись в прошлое»: разрешаются ситуации, когда обновления данных на шаге 1 меняют данные, записанные на шаге 2.

  3. Публикация результата, удаление снапшота.

    Индекс готов к использованию.

Возможное влияние на пользовательские транзакции:

  • Может наблюдаться увеличение задержек из-за того, что транзакции становятся распределенными (при создании синхронного индекса).
  • Возможен повышенный фон ошибок OVERLOADED из-за того, что во время записи данных активно работает автоматическое разделение шардов индексной таблицы.

Примечание

Скорость записи данных выбрана таким образом, чтобы минимизировать влияние процесса записи на пользовательские транзакции. Для управления скоростью настройте лимиты для соответствующей очереди брокера ресурсов.

Создание индекса — асинхронная операция. Если после запуска операции произойдет разрыв клиент-серверной связности, то построение индекса будет продолжено. Управлять асинхронной операцией можно через YDB CLI.

Создание и удаление вторичных индексов

Вторичный индекс может быть:

  • Создан при создании таблицы командой YQL CREATE TABLE.
  • Добавлен к существующей таблице командой YQL ALTER TABLE или командой YDB CLI table index add
  • Удален у существующей таблицы командой YQL ALTER TABLE или командой YDB CLI table index drop.
  • Удален вместе с таблицей командой YQL DROP TABLE или командой YDB CLI table drop.

Применение вторичных индексов

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