Блум-индекс — быстрый старт
Создание таблицы с индексом bloom_filter
Ниже минимальный пример: колоночная таблица с первичным ключом и локальным индексом bloom_filter по колонке, которая часто используется в условиях фильтрации.
CREATE TABLE events (
id Uint64 NOT NULL,
resource_id Utf8 NOT NULL,
payload String,
message Utf8,
PRIMARY KEY (id),
INDEX idx_res LOCAL USING bloom_filter
ON (resource_id)
WITH (false_positive_probability = 0.01)
)
WITH (
STORE = COLUMN
);
Расширение примера: n-граммный индекс
К той же таблице из примера выше можно добавить bloom_ngram_filter по строковой колонке (для колоночных таблиц):
ALTER TABLE events
ADD INDEX idx_msg LOCAL USING bloom_ngram_filter
ON (message)
WITH (
ngram_size = 3,
false_positive_probability = 0.01,
case_sensitive = true
);
Запросы и эффект
После загрузки данных селективные запросы с условиями по проиндексированным колонкам могут читать меньше данных: при обходе хранилища Блум-индекс пропускает фрагменты, в которых искомое значение гарантированно отсутствует (по сравнению с полным чтением колонки без такого фильтра).
Пример данных и запросов к таблице из примеров выше:
INSERT INTO events (id, resource_id, payload, message) VALUES
(1, "res-1", "{}", "started"),
(2, "res-42", "{}", "error: timeout"),
(3, "res-2", "{}", "done");
Фильтр по значению в колонке с bloom_filter — движок может отсечь лишние фрагменты при чтении resource_id и связанных колонок:
SELECT id, message
FROM events
WHERE resource_id = "res-42";
Поиск подстроки в колонке с bloom_ngram_filter — индекс по n-граммам помогает отбросить фрагменты без подходящих n-грамм в message:
SELECT id, message
FROM events
WHERE message LIKE '%timeout%';
Как убедиться в эффективности индекса
Чтобы проверить, что Блум-индекс действительно помогает, выполните один и тот же селективный запрос на таблице с достаточным объёмом данных до и после создания индекса и сравните время выполнения.
Дополнительные материалы:
- подробности и ограничения — в статье Блум-индексы;
- настройка параметров — раздел Настройка параметров;
- полный синтаксис — в ALTER TABLE ADD INDEX.