---
metadata:
  - name: generator
    content: Diplodoc Platform v5.56.0
alternate:
  - https://ydb.tech/docs/en/concepts/query_execution/local_indexes.md?version=main
  - https://ydb.tech/docs/ru/concepts/query_execution/local_indexes.md?version=main
  - href: ru/concepts/query_execution/local_indexes.md
    type: text/markdown
    title: Markdown version
  - href: ../../llms.txt
    type: text/markdown
    title: llms.txt
sourcePath: ru/core/concepts/query_execution/local_indexes.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

# Локальные индексы

## Понятие локального индекса

[Локальный индекс](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#local-index) — вспомогательная структура, которая хранится вместе с данными таблицы и применяется на этапе чтения из хранилища. Она не материализует отдельную индексную таблицу.

Локальные индексы работают как фильтры чтения основной таблицы: [оптимизатор запросов](https://ydb.tech/docs/ru/concepts/query_execution/optimizer.md?version=main) и слой хранения используют их, чтобы пропускать нерелевантные фрагменты данных при сканировании.

Сейчас в YDB реализованы локальные [Блум-индексы](#bloom-skip-indexes) и [min_max-индекс](#min-max-index).

## Блум-индексы {#bloom-skip-indexes}

Блум-индексы — частный случай [локального индекса](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#local-index), построенный на основе [фильтра Блума](https://ru.wikipedia.org/wiki/Фильтр_Блума).

При чтении для каждого фрагмента данных индекс проверяет, может ли в нём встречаться искомое значение (или набор n-грамм). Если фильтр сообщает, что значение точно не встречается, фрагмент пропускается без чтения проиндексированных колонок. Если фильтр «пропускает» проверку, значение может присутствовать — в том числе из-за ложноположительного срабатывания, — и фрагмент нужно читать. Это уменьшает объём фактически прочитанных данных при селективных запросах.

### Типы блум-индексов

* `bloom_filter` — строит фильтр по точным значениям индексируемой колонки. Подходит для условий равенства (`=`), проверки вхождения в список (`IN`) и других сравнений на равенство для поддерживаемых типов.
* `bloom_ngram_filter` — строит фильтр по n-граммам строковой колонки (`String`, `Utf8`). При поиске по подстроке или шаблону (`LIKE`) запрос разбивается на n-граммы; если в индексе фрагмента нет хотя бы одной из требуемых n-грамм, в нём не может быть искомой подстроки, и фрагмент пропускается. Поддерживается только в [колоночных таблицах](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#column-oriented-table).

### Локальные блум-индексы

Тип `bloom_filter` работает как в [строковых](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#row-oriented-table) (OLTP), так и в [колоночных](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#column-oriented-table) (OLAP) таблицах, но реализация различается:

* В строковых таблицах фильтр строится как префиксный фильтр Блума по левому префиксу [первичного ключа](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#primary-key). Индексируемые колонки должны образовывать непрерывное ведущее подмножество колонок первичного ключа. Это ускоряет точечные чтения и сканы по диапазону, ограничивающие ведущие колонки ключа. Для создания префиксного фильтра Блума используйте [ALTER TABLE ... ADD INDEX](https://ydb.tech/docs/ru/yql/reference/syntax/alter_table/indexes.md?version=main#local-bloom), для удаления — [ALTER TABLE ... DROP INDEX](https://ydb.tech/docs/ru/yql/reference/syntax/alter_table/indexes.md?version=main#drop-index).
* В колоночных таблицах фильтр строится по значениям индексируемой колонки в каждом фрагменте данных (порции) и применяется при аналитических сканах для пропуска фрагментов, не содержащих искомое значение.

{% note info "Ограничения" %}

<!-- source: ru/yql/reference/syntax/_includes/bloom_skip_index_limitations.md -->
* Секции `COVER (...)` и дополнительные колонки индекса не поддерживаются.
* Для колоночных таблиц индексируемая колонка должна быть одна. Для строковых таблиц допускается несколько индексируемых колонок.
* Для строковых таблиц тип индекса `bloom_ngram_filter` не поддерживается.
* На строковых таблицах индексируемые колонки `bloom_filter` должны образовывать левый префикс [первичного ключа](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#primary-key). Наборы колонок, не являющиеся префиксом, отклоняются.
* На строковых таблицах два индекса `bloom_filter` не могут иметь одинаковую длину префикса (один и тот же набор ведущих колонок первичного ключа).
<!-- endsource: ru/yql/reference/syntax/_includes/bloom_skip_index_limitations.md -->

{% endnote %}

### Дополнительные материалы

* [Блум-индексы](https://ydb.tech/docs/ru/dev/bloom-skip-indexes.md?version=main)
* [ALTER TABLE ADD INDEX](https://ydb.tech/docs/ru/yql/reference/syntax/alter_table/indexes.md?version=main#local-bloom)

## min_max-индекс {#min-max-index}

min_max-индекс — частный случай [локального индекса](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#local-index), который хранит минимальное и максимальное значение одной индексируемой колонки для каждого фрагмента данных.

При чтении с фильтром [специального вида](#min-max-index-predicates) по колонке с min_max-индексом YDB сначала читает сохранённые для фрагмента минимальное и максимальное значения и проверяет, пересекается ли интервал из фильтра с этим диапазоном. Если интервалы не пересекаются, предикат гарантированно ложен на всех значениях фрагмента, поэтому фрагмент можно не читать. Это полезно для диапазонных предикатов и условий равенства (частный случай диапазонного предиката) по колонкам с небольшим разбросом между минимальным и максимальным значениями внутри хранимых фрагментов.

Пример:

В хранилище для [таблицы `events`](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/min_max_index.md?version=main#example) в одном из фрагментов колонки `level` типа `Int32` находятся значения `[5, 5, 9, 5, 9, 13]`. Тогда минимальное значение — 5, максимальное — 13. Для запроса `SELECT * FROM events WHERE level = 15` интервал фильтра — `[15, 15]`. Он не пересекается с интервалом `[5, 13]`, поэтому такой фрагмент можно не читать из хранилища.

### Предикаты min_max-индекса {#min-max-index-predicates}

Оптимизатор может использовать min_max-индекс для предикатов `=`, `<`, `<=`, `>`, `>=`, `BETWEEN`, а также совместимых комбинаций с `AND` или `OR`.

{% note info "Ограничения" %}

<!-- source: ru/yql/reference/syntax/_includes/min_max_index_limitations.md -->
* Поддерживаются только для [колоночных таблиц](https://ydb.tech/docs/ru/concepts/glossary.md?version=main#column-oriented-table).
* В `ON (...)` должна быть указана ровно одна колонка.
* `COVER (...)` и дополнительные колонки данных не поддерживаются.
* Специфичные параметры `WITH (...)` не поддерживаются.
* `ALTER INDEX` для min_max-индекса не поддерживается.
* Колонки типов `Json` и `JsonDocument` не поддерживаются.
<!-- endsource: ru/yql/reference/syntax/_includes/min_max_index_limitations.md -->

{% endnote %}

### Дополнительные материалы

* [min_max-индекс](https://ydb.tech/docs/ru/dev/min_max-skip-index.md?version=main)
* [ALTER TABLE ADD INDEX](https://ydb.tech/docs/ru/yql/reference/syntax/alter_table/indexes.md?version=main#local-min-max)
