min_max-индекс
min_max-индекс — локальный индекс, который ускоряет сканирующие запросы с высокоселективным фильтром за счёт пропуска фрагментов. В отличие от глобальных вторичных индексов, он работает как фильтр чтения основной таблицы и уменьшает объём данных, которые нужно фактически прочитать.
Для каждого индексируемого фрагмента данных min_max-индекс хранит минимальное и максимальное значение одной колонки. Во время выполнения запроса YDB вычисляет предикат на этих двух значениях. Если из результатов вычисления следует, что предикат отфильтрует все кортежи фрагмента, фрагмент пропускается.
Примеры
Синтаксис создания: CREATE TABLE, ALTER TABLE ADD INDEX.
Создание колоночной таблицы с min_max-индексом:
CREATE TABLE events (
id Uint64,
created_at Timestamp,
level Int32,
resource_id Utf8,
PRIMARY KEY (id),
INDEX idx_created_at LOCAL USING min_max
ON (created_at),
INDEX idx_level LOCAL USING min_max
ON (level)
)
WITH (
STORE = COLUMN
);
Добавление min_max-индекса к существующей колоночной таблице:
ALTER TABLE events
ADD INDEX idx_resource_id LOCAL USING min_max
ON (resource_id);
Запросы с диапазонными предикатами могут использовать индекс для пропуска неподходящих фрагментов:
SELECT id, resource_id
FROM events
WHERE created_at BETWEEN Timestamp("2024-01-01T00:00:00.000000Z")
AND Timestamp("2024-01-02T00:00:00.000000Z");
Когда применять
min_max-индекс полезен, когда значения индексируемой колонки слабо меняются между соседними по первичному ключу строками таблицы: например, это временные метки, монотонно растущие идентификаторы или другие значения, коррелированные с первичным ключом.
Также min_max-индекс может быть полезен, когда предикат фильтра выбирает очень малую долю данных (порядка одной строки на миллион). Например, при запросах над таблицей логов сервиса, оставляющих только записи с уровнем ERROR: если сервис пишет одну ошибку на 1 000 000 записей, min_max-индекс, вероятно, существенно сократит объём чтения.
Особенности и ограничения
- Индекс всегда локальный (
LOCAL); глобального варианта нет. - В запросах не используется синтаксис
VIEW <index>(в отличие, например, от полнотекстовых индексов). - Фильтр применяется при чтении только к тем фрагментам данных, для которых при записи или слиянии уже вычислены и сохранены вместе с данными таблицы минимальное и максимальное значения индексируемой колонки; для остальных фрагментов пропуск по этому индексу не выполняется.
Ограничения
- Поддерживаются только для колоночных таблиц.
- В
ON (...)должна быть указана ровно одна колонка. COVER (...)и дополнительные колонки данных не поддерживаются.- Специфичные параметры
WITH (...)не поддерживаются. ALTER INDEXдля min_max-индекса не поддерживается.- Колонки типов
JsonиJsonDocumentне поддерживаются.