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).
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
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
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.