[Предварительная версия] Индекс N-gram bloom filter
Индекс N-gram bloom filter — это специальный индекс Bloom filter, который обычно используется для ускорения LIKE-запросов и повышения скорости вычисления функций ngram_search и ngram_search_case_insensitive.
Индекс N-gram bloom filter подходит только для столбцов строкового типа (STRING, CHAR или VARCHAR). Разница между индексом N-gram bloom filter и индексом Bloom filter заключается в том, что индекс N-gram bloom filter сначала токенизирует строки, а затем записывает полученные подстроки в индекс Bloom filter. Например, значение определенного индексированного столбца — это строка Technical. Для традиционного индекса Bloom filter вся строка Technical была бы записана в индекс напрямую. Однако для индекса N-gram bloom filter с указанным gram_num равным 4, строка Technical сначала была бы токенизирована на следующие подстроки:
"Tech", "echn", "chni", "hnic", "nica", "ical"
И затем каждая из этих шести подстрок записывается в индекс Bloom filter.
Примечания по использованию
- Для таблицы Duplicate Key или Primary Key вы можете создавать индексы N-gram bloom filter для всех столбцов строковых типов. Для таблицы Aggregate или Unique Key вы можете создавать индексы N-gram bloom filter только для ключевых столбцов строковых типов.
- Индексы N-gram bloom filter могут быть созданы только для столбцов строковых типов (CHAR, STRING и VARCHAR).
- Чтобы определить, попадает ли запрос в индекс N-gram bloom filter, вы можете проверить поле
BloomFilterFilterRowsв профиле запроса. - Для одного столбца может быть создан только один тип индекса (Bloom Filter или N-gram Bloom Filter).
Основные операции
Создание индекса N-gram bloom filter
CREATE TABLE test.table1
(
k1 CHAR(10),
k2 CHAR(10),
v1 INT SUM,
INDEX index_name (k2) USING NGRAMBF ("gram_num" = "4",
"bloom_filter_fpp" = "0.05") COMMENT ''
)
ENGINE = olap
AGGREGATE KEY(k1, k2)
DISTRIBUTED BY HASH(k1);
Параметры, связанные с индексом N-gram bloom filter:
| Параметр | Обязательный | Описание |
|---|---|---|
index_name | Да | Имя индекса. Имена индексов должны быть уникальными в пределах таблицы. |
column_name | Да | Имя столбца, для которого создается индекс. Может быть указано только одно имя столбца. В приведенном выше примере это k2. |
gram_num | Нет | Длина подстроки после токенизации строки в индексированном ст олбце. Значение по умолчанию — 2. |
bloom_filter_fpp | Нет | Вероятность ложноположительного результата фильтра Bloom, в диапазоне от 0.0001 до 0.05. Значение по умолчанию — 0.05. Меньшее значение обеспечивает лучшую фильтрацию, но требует больших затрат на хранение. |
case_sensitive | Нет | Учитывает ли этот индекс регистр или нет. Значение по умолчанию — true. |
COMMENT | Нет | Комментарий к индексу. |
Объяснения других параметров, связанных с созданием таблиц, см. в CREATE TABLE.
Просмотр индекса N-gram bloom filter
Вы можете просмотреть все индексы таблицы, используя SHOW CREATE TABLE или SHOW INDEX FROM table. Поскольку создание индекса является асинхронным, вы можете увидеть соответствующий индекс только после его успешного создания.
SHOW CREATE TABLE table1;
SHOW INDEX FROM table1;
Изменение индекса N-gram bloom filter
Вы можете добавлять и удалять индекс N-gram bloom filter, используя оператор ALTER TABLE.
-
Выполните следующий оператор, чтобы добавить новый индекс N-gram bloom filter
new_index_nameдля столбцаk1в табл ицуtable1.ALTER TABLE table1
ADD INDEX new_index_name(k1) USING NGRAMBF ("gram_num" = "4",
"bloom_filter_fpp" = "0.05") COMMENT ''; -
Выполните следующий оператор, чтобы удалить индекс N-gram bloom filter
new_index_nameиз таблицыtable1.ALTER TABLE table1 DROP INDEX new_index_name;
Изменение индекса — это асинхронная операция. Вы можете просмотреть прогресс этой операции, выполнив SHOW ALTER TABLE. Вы можете запускать только одну задачу изменения индекса в таблице за раз.
Запросы, которые могут быть ускорены
LIKE запросы
Индекс N-gram bloom filter может ускорить LIKE запросы, если gram_num достаточно мал (меньше длины строки, по которой выполняется поиск). В противном случае индекс N-gram bloom filter не может ускорить LIKE запросы.
Например, если gram_num равен 4, а оператор запроса — SELECT * FROM table WHERE col1 LIKE "%abc", индекс N-Gram Bloom filter не будет ускорять этот запрос, поскольку искомая строка abc содержит только три символа, что меньше значения 4 параметра gram_num. Если условие запроса — WHERE col1 LIKE "%abcd" или WHERE col1 LIKE "%abcde%", индекс N-Gram Bloom filter будет ускорять запрос.
ngram_search
Когда функция ngram_search используется в запросе, если столбец, указанный в функции, имеет индекс N-gram bloom filter и gram_num, указанный в функции, соответствует gram_num индекса N-gram bloom filter, индекс автоматически отфильтрует данные со строковым сходством 0, значительно ускоряя процесс выполнения функции.
ngram_search_case_insensitive
Использование этой функции такое же, как у ngram_search, за исключением того, что эта функция чувствительна к регистру. Поэтому требуется, чтобы case_sensitive было установлено в false при создании индекса N-gram bloom filter.
CREATE TABLE test.table1
(
k1 CHAR(10),
k2 CHAR(10),
v1 INT SUM,
INDEX index_name (k2) USING NGRAMBF ("gram_num" = "4",
"bloom_filter_fpp" = "0.05",
"case_sensitive" = "false") COMMENT ''
)
ENGINE = olap
AGGREGATE KEY(k1, k2)
DISTRIBUTED BY HASH(k1);
Если индекс уже создан и его параметр case_sensitive установлен в true, вы можете изменить параметр этого индекса на false, используя:
ALTER TABLE table1
ADD INDEX new_index_name(k1) USING NGRAMBF ("gram_num" = "4",
"bloom_filter_fpp" = "0.05",
"case_sensitive" = "false") COMMENT '';