Работа с индексами | Tcs

Version:

0.x
Руководство пользователя Работа с индексами

Работа с индексами

TCS поддерживает два типа индексов:

Индексы key-value

Особенности индексов key-value в TCS

Индексы key-value создаются пустыми и наполняются по мере вставки новых данных.

Этот вид индексов работает только для запросов на равенство значений. Запросы на сравнение значений (больше/меньше) пока не поддерживаются.

Индексы key-value работают в режиме оптимизированного индексирования, при котором во вторичные индексы не добавляются записи со значением null в индексируемом поле. За счет этого индексы не хранят отфильтрованные записи, поэтому индексирование выполняется быстрее. Также это позволяет повысить производительность обновления индексов в TCS.

Создание индекса key-value

Чтобы построить индекс key-value для некоторой колонки, в конфигурации данных для данной колонки нужно указать следующие параметры:

  • (обязательно) indexed со значением true,

  • (необязательно) index_depth со значением null или строго больше 0.

Например, здесь key-value индекс построен по первой колонке (id):

# tcs.yml
tcs:
  block_size: 1024
  default_column_values_limit: 20000
  schema:
    db:
      public:
        users:
          columns:
            - data_type: utf8
              column_values_limit: 10000
              name: id
              index_depth: 10000
              indexed: true
            - data_type: utf8
              column_values_limit: 1000
              name: username
              indexed: false

Удаление индекса key-value

Чтобы удалить индекс key-value, в конфигурации данных для соответствующей индексу колонки нужно указать параметр indexed: false.

После применения конфигурации индекс будет удален, а запросы на равенство значений будут производиться не по индексу.

Изменение глубины индекса key-value

Изменять глубину индекса можно с помощью параметра index_depth в конфигурации данных для соответствующей индексу колонки:

  • при уменьшении значения index_depth индексные записи дальше этого предела индексирования будут удалены,

  • при увеличении значения index_depth в индекс будут добавлены новые индексные записи.

Перестроение индекса key-value

Возможность принудительной переиндексации для индексов key-value пока не предусмотрена.

Индексы BRIN

Индексы BRIN (Block Range Index) предназначены для обработки больших таблиц, в которых значение в столбце имеет некоторую естественную корреляцию с физическим положением строки в таблице (например, временные метки создания записи). Иными словами, они эффективны, если запрос без ORDER BY выдает значения столбца в порядке возрастания или убывания, и столбец при этом не является индексируемым.

Таким образом, особенность этого типа индексов состоит не в том, чтобы быстро находить нужные строки, а в том, чтобы избегать просмотра заведомо ненужных строк. Чтение по индексу BRIN исключает те блоки хранения, в которых точно не будет какого-то значения, указанного в условии выборки, поскольку оно либо меньше минимального значения в блоке, либо больше максимального.

Особенности индексов BRIN в TCS

Индексы BRIN строятся на основе метаданных, которые сохраняются и пересчитываются для колонок в каждом блоке хранения:

  • min – минимальное значение в колонке,

  • max – максимальное значение в колонке.

Пересчет и сохранение этих метаданных работает всегда, а вместо создания и удаления индекса BRIN задается только способ чтения – с использованием индекса BRIN или без.

Чтение с использованием индекса BRIN осуществляется автоматически для следующих случаев:

  • обработка запросов с условием типа WHERE col BETWEEN $left AND $right,

  • условия строгого равенства, но только для неиндексированных колонок.

Таким образом, чтение с использованием индекса BRIN по неупорядоченной неиндексированной колонке предполагает полное сканирование (full scan).

Индексы BRIN работают со следующими типами данных:

  • целочисленные (i8, i16, i32, i64),

  • временные метки (ts),

  • беззнаковые целые (u8, u16, u32, u64),

  • числа с плавающей точкой (f32, f64).

Включение чтения по индексу BRIN

Чтобы включить чтение по индексу BRIN для некоторой колонки, в конфигурации данных для данной колонки нужно указать следующие параметры:

  • indexed со значением false,

  • brin_used со значением true.

Например, здесь индекс BRIN построен по третьей колонке (created_at):

# tcs.yml
tcs:
  block_size: 1024
  default_column_values_limit: 20000
  schema:
    db:
      public:
        users:
          columns:
            - data_type: utf8
              column_values_limit: 10000
              name: id
              index_depth: 10000
              indexed: true
            - data_type: utf8
              column_values_limit: 1000
              name: username
              indexed: false
            - data_type: ts
              name: created_at
              indexed: false
              brin_used: true

Примечание

  • Если для колонки указано indexed: true и brin_used: true, то при чтении по индексу с условием строгого равенства приоритет будет отдаваться индексу key-value, а не индексу BRIN.

Отключение чтения по индексу BRIN

Чтобы отключить чтение по индексу BRIN для некоторой колонки, в конфигурации данных для соответствующей индексу колонки нужно убрать параметр brin_used: true, либо явно указать brin_used: false. После применения конфигурации запросы на чтение по данной колонке будут производиться не по индексу BRIN.

Включение BRIN-фильтра

При включенном BRIN-фильтре TCS осуществляет чтение c полным сканированием (full scan), которое позволяет на раннем этапе отсеивать блоки, которые точно не включают в себя искомые записи. В отличие от обычного чтения по индексу BRIN, BRIN-фильтр не совершает предварительную выборку подходящих блоков. Это может сделать его более эффективным при выборке большого количества значений, а также может ускорить обработку запросов с условиями фильтрации по открытым интервалам. Рекомендуется экспериментально определять для каждого запроса, насколько подходит этот метод чтения.

Чтобы включить BRIN-фильтр, в заголовке запроса следует передать параметр x-tcs-brin_filter: true. Этот параметр поддерживается для запросов по следующим HTTP-адресам:

  • /sql

  • /streaming/sql

  • /computation/run

  • /exec/*

В результате BRIN-фильтр будет включен для всех числовых колонок в запросе, для которых в конфигурации настроено indexed = false и brin_used = false.

Примечание

Возможность включить BRIN-фильтр для конкретной колонки не поддерживается в текущей версии TCS.

Совместное использование разных типов индексов

Возможно совместное использование разных типов индексов в запросе.

Например, есть таблица docs с двумя индексами:

  • индекс key-value по колонке doc_num,

  • индекс BRIN по колонке created_at.

docs:
  columns:
    - indexed: true
      data_type: utf8
      name: doc_num
      index_depth: 500
    - indexed: false
      brin_used: true
      data_type: u64
      name: created_at
      index_depth: 10000

Следующий запрос использует оба этих индекса:

select
  count(*)
from
  docs
where
  created_at between 1729520000 and <> 1729540000
  and doc_num = '100-1-223';
Found what you were looking for?
Feedback