Перейти к основному содержимому

Индексы Bloom filter

В этой теме описывается, как создавать и изменять индексы bloom filter, а также как они работают.

Индекс bloom filter — это пространственно-эффективная структура данных, которая используется для обнаружения возможного присутствия фильтруемых данных в файлах данных таблицы. Если индекс bloom filter обнаруживает, что данные для фильтрации отсутствуют в определенном файле данных, Selena пропускает сканирование этого файла данных. Индексы bloom filter могут сократить время отклика, когда столбец (например, ID) имеет относительно высокую кардинальность.

Если запрос попадает на столбец ключа сортировки, Selena эффективно возвращает результат запроса, используя prefix index. Однако запись prefix index для блока данных не может превышать 36 байт в длину. Если вы хотите улучшить производительность запросов по столбцу, который не используется в качестве ключа сортировки и имеет относительно высокую кардинальность, вы можете создать индекс bloom filter для этого столбца.

Как это работает

Например, вы создаете индекс bloom filter на столбце column1 заданной таблицы table1 и выполняете запрос типа Select xxx from table1 where column1 = something;. Тогда происходят следующие ситуации, когда Selena сканирует файлы данных table1.

  • Если индекс bloom filter обнаруживает, что файл данных не содержит данные для фильтрации, Selena пропускает файл данных для улучшения производительности запроса.
  • Если индекс bloom filter обнаруживает, что файл данных может содержать данные для фильтрации, Selena читает файл данных, чтобы проверить, существуют ли данные. Обратите внимание, что bloom filter может точно сказать, если значение отсутствует, но не может точно сказать, что значение присутствует, только что оно может присутствовать. Использование индекса bloom filter для определения присутствия значения может давать ложные срабатывания, что означает, что индекс bloom filter обнаруживает, что файл данных содержит данные для фильтрации, но файл данных фактически не содержит эти данные.

Примечания по использованию

  • Вы можете создавать индексы bloom filter для всех столбцов таблицы Duplicate Key или Primary Key. Для таблицы Aggregate или Unique Key вы можете создавать индексы bloom filter только для ключевых столбцов.
  • Индексы bloom filter могут быть созданы для столбцов следующих типов данных:
    • Числовые типы: SMALLINT, INT, BIGINT и LARGEINT.
    • Строковые типы: CHAR, STRING и VARCHAR.
    • Типы дат: DATE и DATETIME.
  • Индексы bloom filter могут улучшить производительность только тех запросов, которые содержат операторы in и =, такие как Select xxx from table where x in {} и Select xxx from table where column = xxx.
  • Вы можете проверить, использует ли запрос индексы bloom filter, просмотрев поле BloomFilterFilterRows в профиле запроса.

Создание индексов bloom filter

Вы можете создать индекс bloom filter для столбца при создании таблицы, указав параметр bloom_filter_columns в PROPERTIES. Например, создайте индексы bloom filter для столбцов k1 и k2 в table1.

CREATE TABLE table1
(
k1 BIGINT,
k2 LARGEINT,
v1 VARCHAR(2048) REPLACE,
v2 SMALLINT DEFAULT "10"
)
ENGINE = olap
PRIMARY KEY(k1, k2)
DISTRIBUTED BY HASH (k1, k2)
PROPERTIES("bloom_filter_columns" = "k1,k2");

Вы можете создать индексы bloom filter для нескольких столбцов одновременно, указав имена этих столбцов. Обратите внимание, что имена столбцов нужно разделять запятыми (,). Описание других параметров оператора CREATE TABLE см. в CREATE TABLE.

Отображение индексов bloom filter

Например, следующий оператор отображает индексы bloom filter таблицы table1. Описание вывода см. в SHOW CREATE TABLE.

SHOW CREATE TABLE table1;

Изменение индексов bloom filter

Вы можете добавлять, уменьшать и удалять индексы bloom filter, используя оператор ALTER TABLE.

  • Следующий оператор добавляет индекс bloom filter на столбец v1.

    ALTER TABLE table1 SET ("bloom_filter_columns" = "k1,k2,v1");
  • Следующий оператор удаляет индекс bloom filter со столбца k2.

    ALTER TABLE table1 SET ("bloom_filter_columns" = "k1");
  • Следующий оператор удаляет все индексы bloom filter таблицы table1.

    ALTER TABLE table1 SET ("bloom_filter_columns" = "");

Примечание: Изменение индекса — это асинхронная операция. Вы можете просмотреть прогресс этой операции, выполнив SHOW ALTER TABLE. Вы можете запускать только одну задачу изменения индекса на таблице за раз.