Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
© 2022 ООО «Яндекс.Облако»
  • Оглавление
  • Начало работы
    • Обзор
    • Создание базы данных
    • Аутентификация
    • Интерфейс командной строки YDB CLI
    • Язык запросов YQL
    • YDB SDK
    • Развертывание одноузлового кластера
      • Обзор
      • Docker
      • Бинарный файл
      • Minikube
    • Полезные ссылки
    • Document API, совместимый с Amazon DynamoDB
      • Настройка инструментов AWS
      • Работа с данными через HTTP-интерфейс
      • Работа с AWS CLI
        • Обзор
        • Создание таблицы
        • Добавление данных в таблицу
        • Чтение данных из таблицы
        • Обновление данных
        • Выборка данных
        • Удаление созданных ресурсов
      • Работа с AWS SDK
        • Обзор
        • Создание таблицы
        • Загрузка данных в таблицу
        • Управление записями в таблице
          • Создание записи
          • Чтение записи
          • Обновление записи
          • Удаление записи
        • Поиск и извлечение данных
        • Удаление таблицы
  • Практические руководства
    • Развертывание веб-приложения
    • Разработка Slack-бота
    • Подключение к YDB из функции Yandex Cloud Functions на Python
    • Подключение к базе данных YDB из функции Yandex Cloud Functions на Node.js
    • Конвертация видео в GIF на Python
    • Разработка навыка Алисы и сайта с авторизацией
  • Концепции
    • Обзор
    • Термины и определения
    • Соединение с БД и аутентификация
    • Модель данных и схема
    • Режимы работы Serverless и Dedicated
    • Транзакции
    • Вторичные индексы
    • Time to Live (TTL)
    • Скан запросы
    • Ограничения базы данных
    • Кластер YDB
      • Обзор
      • Общая схема YDB
      • Дисковая подсистема кластера
    • Квоты и лимиты
  • Пошаговые инструкции
    • Обзор
    • Переименование
    • Использование плана запроса и AST
    • Чтение и запись данных
    • Работа со вторичными индексами
  • Рекомендации
    • Обзор
    • Выбор первичного ключа для максимальной производительности
    • Вторичные индексы
    • Постраничный вывод
    • Загрузка больших объемов данных
    • Использование таймаутов
  • Управление базами данных
    • Обзор
    • Облачная консоль управления
      • Обзор
      • Создание, изменение, удаление баз данных
      • Таблицы и директории
      • Управление доступом
    • Интерфейс командной строки YC CLI
    • Резервное копирование и восстановление
    • Диагностика
      • Обзор
      • Системные таблицы
      • Мониторинг
  • Правила тарификации
    • Обзор
    • Бессерверный режим
      • Правила тарификации для бессерверного режима
      • Стоимость запроса для YQL
      • Стоимость запроса для Document API
      • Стоимость запроса для специальных API
    • Режим с выделенными инстансами
  • HTTP API, совместимый с Amazon DynamoDB
    • Все методы
    • Actions
      • BatchGetItem
      • BatchWriteItem
      • CreateTable
      • DeleteItem
      • DeleteTable
      • DescribeTable
      • DescribeTimeToLive
      • GetItem
      • ListTables
      • PutItem
      • Query
      • Scan
      • TransactGetItems
      • TransactWriteItems
      • UpdateItem
      • UpdateTimeToLive
    • Общие ошибки
  • YQL
    • Обзор
    • Типы данных
      • Обзор
      • Простые
      • Опциональные
      • Контейнеры
      • Специальные
      • Преобразования типов
      • Текстовое представление типов данных
      • JSON
    • Синтаксис
      • Обзор
      • Лексическая структура
      • Выражения
      • ACTION
      • ALTER TABLE
      • CREATE TABLE
      • DECLARE
      • DELETE
      • DISCARD
      • DROP TABLE
      • GROUP BY
      • FLATTEN
      • INSERT
      • INTO RESULT
      • JOIN
      • PRAGMA
      • REPLACE
      • SELECT
      • UPDATE
      • UPSERT
      • VALUES
      • WINDOW
      • Неподдерживаемые конструкции
    • Встроенные функции
      • Обзор
      • Базовые
      • Агрегатные
      • Оконные
      • Для работы со списками
      • Для работы со словарями
      • Для работы со структурами
      • Для работы с типами
      • Для работы с JSON
      • Библиотеки C++
        • Обзор
        • Hyperscan
        • Pcre
        • Pire
        • Re2
        • String
        • Unicode
        • DateTime
        • Url
        • Ip
        • Yson
        • Digest
        • Math
        • Histogram
    • Туториал YQL
      • Обзор
      • Создание таблицы
      • Добавление данных в таблицу
      • Выборка данных из всех колонок
      • Выборка данных из определенных колонок
      • Сортировка и фильтрация
      • Агрегирование данных
      • Дополнительные условия выборки
      • Объединение таблиц с помощью JOIN
      • Вставка и модификация данных с помощью REPLACE
      • Вставка и модификация данных с помощью UPSERT
      • Вставка данных с помощью INSERT
      • Обновление данных с помощью UPDATE
      • Удаление данных
      • Добавление и удаление колонок
      • Удаление таблицы
  • Работа с YDB CLI
    • Обзор
    • Установка
    • Структура команд YDB CLI
    • Сервисные команды
    • Соединение с БД и аутентификация
    • Глобальные параметры
    • Работа со схемой БД
      • Список объектов
      • Информация об объекте
      • Директории
      • Вторичные индексы
      • Переименование таблиц
    • Работа с данными
      • Выполнение запроса к данным
      • План исполнения запроса
      • Потоковое чтение таблицы
      • Скан запросы
    • Загрузка и выгрузка данных
      • Обзор
      • Файловая структура выгрузки
      • Выгрузка в файловую систему
      • Загрузка из файловой системы
      • Соединение и аутентификация с S3
      • Выгрузка в S3
      • Загрузка из S3
      • Импорт данных из файла в существующую таблицу
    • Управление профилями
      • Обзор
      • Создание профиля
      • Использование профиля в запросах
      • Получение информации о профиле
      • Удаление профиля
      • Активированный профиль
    • Информационные сервисы
      • Список эндпоинтов
      • Проверка аутентификации
    • Нагрузочное тестирование
      • Обзор
      • Stock нагрузка
  • Работа с YDB SDK
    • Обзор
    • Установка
    • Аутентификация
    • Тестовое приложение
      • Обзор
      • C++
      • C# (.NET)
      • Go
      • Java
      • Node.js
      • PHP
      • Python
      • Архив
        • Go v1
        • Go v2
    • Обработка ошибок в API
    • Рецепты кода
      • Обзор
      • Аутентификация
        • Обзор
        • С помощью токена
        • Анонимная
        • Файл сервисного аккаунта
        • Сервис метаданных
        • С помощью переменных окружения
        • С помощью логина и пароля
      • Балансировка
        • Обзор
        • Равномерный случайный выбор
        • Предпочитать ближайший дата-центр
        • Предпочитать зону доступности
      • Выполнение повторных запросов
      • Диагностика проблем
        • Обзор
        • Включить логирование
        • Подключить метрики в Prometheus
        • Подключить трассировку в Jaeger
      • Установить размер пула сессий
      • Вставка данных
      • Пакетная вставка данных
  • Управление кластером
    • Обзор
    • Развертывание
      • Обзор
      • Kubernetes
        • Обзор
        • Развертывание в Yandex Managed Service for Kubernetes
        • Развертывание в AWS Elastic Kubernetes Service
        • Эксплуатация
      • VM / Baremetal
      • Конфигурация
    • Обслуживание дисковой подсистемы кластера
      • Обзор
      • Способы предотвращения выхода за модель отказа
      • Балансировка нагрузки на диски
      • Способы освобождения места на физических устройствах
      • Расширение кластера
      • Добавление групп хранения
      • Безопасные рестарт и выключение узлов
      • Включение/выключение SelfHeal
      • Включение/выключение Scrubbing
      • Перевоз VDisk'ов
      • Изменение конфигураций через CMS
      • Изменение конфигурации акторсистемы
    • Встроенный UI
      • Обзор
      • YDB Monitoring
      • Hive web-viewer
      • Обзор соединений
      • Логи
      • Графики
    • Системные таблицы
  • Вопросы и ответы
    • Обзор
    • Общие вопросы
    • Ошибки
    • YQL
    • Serverless
    • Все вопросы на одной странице
  • Публичные материалы
  1. Концепции
  2. Вторичные индексы

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

Статья создана
Yandex Cloud
  • Синхронный вторичный индекс
  • Асинхронный вторичный индекс
  • Покрывающий вторичный индекс
  • Онлайн-создание вторичного индекса
  • Создание и удаление вторичных индексов
  • Назначение и применение вторичных индексов

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

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

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

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

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

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

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

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

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

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

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

В 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.

Назначение и применение вторичных индексов

О назначении и применении вторичных индексов при разработке приложений смотрите в рекомендациях.

Была ли статья полезна?

Language / Region
© 2022 ООО «Яндекс.Облако»
В этой статье:
  • Синхронный вторичный индекс
  • Асинхронный вторичный индекс
  • Покрывающий вторичный индекс
  • Онлайн-создание вторичного индекса
  • Создание и удаление вторичных индексов
  • Назначение и применение вторичных индексов