Tous les produits
Search
Centre de documentation

ApsaraDB for SelectDB:Index NGram Bloom filter

Dernière mise à jour :Aug 11, 2026

Les requêtes LIKE sur de grandes colonnes de texte nécessitent souvent des analyses complètes qui lisent chaque bloc de données. Les index NGram Bloom filter permettent à SelectDB d'ignorer les blocs ne correspondant pas au motif de recherche, réduisant ainsi les E/S et accélérant l'exécution des requêtes LIKE.

Fonctionnement

Lorsque vous créez un index NGram Bloom filter sur une colonne, SelectDB découpe chaque valeur stockée en séquences de caractères chevauchantes d'une longueur définie par gram_size, puis les enregistre dans un filtre de Bloom. Par exemple, avec gram_size=3, la chaîne an ngram génère les tokens suivants : 'an ', 'n n', ' ng', 'ngr', 'gra' et 'ram'.

Lors de l'exécution de la requête, SelectDB applique ce même découpage au motif spécifié dans la condition LIKE. Si l'un des tokens du motif est absent du filtre de Bloom pour un bloc de données donné, ce bloc est entièrement ignoré.

Prérequis

Avant de créer un index NGram Bloom filter, assurez-vous que la colonne cible répond aux exigences suivantes :

  • Le type de la colonne est STRING ou VARCHAR.

  • La colonne ne possède pas déjà d'index Bloom filter. Les index NGram Bloom filter et Bloom filter sont mutuellement exclusifs sur une même colonne.

Conditions d'activation de l'index

Un index NGram Bloom filter s'applique à une requête uniquement si les deux conditions suivantes sont remplies :

  • La requête utilise un prédicat LIKE.

  • Le nombre de caractères consécutifs dans le motif LIKE est supérieur ou égal à gram_size.

Par exemple, si gram_size=3, le motif '%ab%' (2 caractères) n'active pas l'index, contrairement au motif '%abc%' (3 caractères).

Remarque

La valeur par défaut de gram_size est 2 si elle n'est pas spécifiée lors de la création de l'index.

Création d'un index NGram Bloom filter

Important

Si vous omettez la clause PROPERTIES, SelectDB utilise gram_size=2 et bf_size=256. Pour obtenir des performances optimales, définissez explicitement ces deux paramètres en fonction de vos motifs de requête.

Lors de la création d'une table (synchrone)

La création d'un index via CREATE TABLE est synchrone : la table et l'index sont créés simultanément.

Syntaxe

CREATE TABLE [IF NOT EXISTS] [db_name.]<table_name>
(
  <column_definition_list>,
  INDEX <index_name>(<column_name>) USING NGRAM_BF
    [PROPERTIES("gram_size" = "<value>", "bf_size" = "<value>")]
    [COMMENT '<comment>']
)
table_properties;

Paramètres

Paramètre Obligatoire Description
db_name Non Base de données dans laquelle la table est créée.
table_name Oui Nom de la table.
column_definition_list Oui Définitions des colonnes.
CREATE-TABLE.

table_properties Oui Propriétés de la table, incluant le modèle de données ainsi que les paramètres de partitionnement et de bucketing. Pour plus d'informations, consultez Modèles de données.
index_name Oui Nom de l'index. Ce nom doit être unique au sein de la table. Utilisez le préfixe idx_ suivi du nom de la colonne (par exemple, idx_review_body).
column_name Oui Colonne à indexer. Une colonne ne peut avoir qu'un seul index NGram Bloom filter ou Bloom filter.
USING NGRAM_BF Oui Spécifie le type d'index NGram Bloom filter.

PROPERTIES

Clé Description
gram_size Longueur des tokens utilisés pour découper les valeurs de la colonne. Choisissez une valeur correspondant à la longueur minimale des motifs de vos requêtes LIKE, avec un minimum de 2. Un gram_size plus petit génère davantage de tokens et augmente le taux de faux positifs ; compensez cela en augmentant bf_size. La combinaison gram_size=3 et bf_size=1024 convient à la plupart des cas d'usage.
bf_size Taille du filtre de Bloom en octets par bloc de données. Une valeur plus élevée réduit le taux de faux positifs et limite les E/S inutiles, mais consomme davantage de stockage et de mémoire. Commencez avec 256 pour vos tests initiaux.

Exemple

CREATE TABLE `test_table` (
  `siteid`      int(11)      NULL DEFAULT "10" COMMENT "",
  `citycode`    smallint(6)  NULL COMMENT "",
  `username`    varchar(32)  NULL DEFAULT "" COMMENT "",
  `review_body` varchar(320) NULL,
  INDEX idx_ngrambf (`review_body`) USING NGRAM_BF
    PROPERTIES("gram_size"="3", "bf_size"="256")
    COMMENT 'review_body ngram_bf index'
) ENGINE=OLAP
AGGREGATE KEY(`siteid`, `citycode`, `username`, `review_body`) COMMENT "OLAP"
DISTRIBUTED BY HASH(`siteid`) BUCKETS 10;

Sur une table existante (asynchrone)

L'ajout d'un index sur une table existante est une opération asynchrone. Exécutez SHOW ALTER TABLE COLUMN; pour vérifier la progression.

Syntaxe

ALTER TABLE <table_name>
  ADD INDEX <index_name>(<column_name>) USING NGRAM_BF
  [PROPERTIES("gram_size" = "<value>", "bf_size" = "<value>")];

Exemple

ALTER TABLE test_table
  ADD INDEX idx_ngrambf2(username) USING NGRAM_BF
  PROPERTIES("gram_size"="2", "bf_size"="512")
  COMMENT 'username ngram_bf index';

Consultation des index d'une table

Utilisez l'instruction suivante pour lister tous les index d'une table ainsi que leurs propriétés :

SHOW INDEXES FROM <table_name>;

Exemple

SHOW INDEX FROM test_table;

Suppression d'un index NGram Bloom filter

Avertissement

La suppression d'un index NGram Bloom filter dégrade les performances des requêtes LIKE. Procédez avec prudence.

Cette opération est asynchrone. Pour vérifier la progression de la suppression, consultez Interroger les informations sur les index inversés.

Syntaxe

ALTER TABLE <table_name> DROP INDEX <index_name>;

Exemple

ALTER TABLE test_table DROP INDEX idx_ngrambf;

Vérification de la progression des modifications d'index

Toutes les opérations d'indexation via ALTER TABLE sont asynchrones. Exécutez l'instruction suivante pour vérifier leur progression :

SHOW ALTER TABLE COLUMN;

FAQ

Comment vérifier qu'un index NGram Bloom filter a été utilisé lors d'une requête ?

Consultez le profil d'exécution de la requête. Ce profil indique quels index ont été appliqués durant l'exécution. Pour plus de détails, reportez-vous à Profil de requête.

J'ai obtenu l'erreur suivante lors de l'ajout d'un index NGram Bloom filter. Que signifie-t-elle ?

ERROR 1105 (HY000): errCode = 2, detailMessage = NGRAM_BF index for columns (review_body) already exist.

Une table peut comporter plusieurs index NGram Bloom filter, mais chacun doit porter sur une colonne différente. Une colonne donnée ne prend en charge qu'un seul index NGram Bloom filter ou Bloom filter. Supprimez d'abord l'index existant sur cette colonne, ou créez le nouvel index sur une autre colonne.