CREATE INDEX crée un index sur une ou plusieurs colonnes d'une table large LindormTable. Utilisez cette commande pour activer les recherches hors clé primaire, la recherche en texte intégral et les requêtes analytiques sans balayage complet de la table.
Applicabilité
La commande CREATE INDEX s'applique uniquement à LindormTable. Aucune version minimale n'est requise pour les index secondaires.
Pour créer un index de recherche ou un index columnstore avec CREATE INDEX, utilisez Lindorm SQL V2.6.1 ou une version ultérieure. Pour vérifier votre version de Lindorm SQL, consultez le guide des versions SQL.
Avant de commencer
La création d'index secondaires, d'index columnstore et d'index de recherche nécessite des lectures de données, qui génèrent des opérations de lecture. Si vous avez activé la séparation des données chaudes et froides pour votre instance, surveillez la limitation du débit sur le stockage froid. Les lectures limitées sur le stockage froid ralentissent la création d'index et peuvent exercer une contre-pression sur les opérations d'écriture.
Syntaxe
CREATE INDEX [IF NOT EXISTS] [index_identifier]
[USING {KV | SEARCH | COLUMNAR}]
ON table_identifier '(' index_key_expression ')'
[INCLUDE '(' column_identifier (, column_identifier)* ')']
[PARTITION BY partition_definition]
[{ASYNC | SYNC}]
[WITH '(' index_options ')']
Sous-productions :
index_key_expression ::= index_key_definition (, index_key_definition)*
| wildcard_string_literal
index_key_definition ::= column_identifier [DESC]
| column_identifier '(' option_definition (, option_definition)* ')'
| function_expression
function_expression ::= Z-ORDER '(' column_identifier (, column_identifier)* ')'
| S2 '(' column_identifier, level ')'
| CAST '(' column_identifier AS type ')'
| MD5 '(' column_identifier ')'
| SHA256 '(' column_identifier ')'
partition_definition ::= {RANGE TIME} '(' column_identifier ')' [PARTITIONS number_literal]
| HASH '(' column_identifier (, column_identifier)* ')' [PARTITIONS number_literal]
| ENUMERABLE '(' column_identifier (, column_identifier)* ')'
index_options ::= option_definition (, option_definition)*
option_definition ::= option_identifier = string_literal
Différences
Les éléments de syntaxe pris en charge varient selon le type d'index.
Élément de syntaxe | Index secondaire | Index de recherche |
✔ | 0 | |
✔ | 0 | |
0 | ✖ | |
✖ | 0 | |
Mode de création d'index (ASYNC|SYNC) Important Seules les versions LindormTable 2.6.3 et ultérieures prennent en charge le mode de création | 0 | 0 |
0 | 0 |
| Élément de syntaxe | Index secondaire | Index de recherche |
|---|---|---|
Mot-clé USING |
Facultatif (KV par défaut) | Facultatif |
| Expression de clé d'index | Obligatoire | Obligatoire |
INCLUDE |
Facultatif | Non pris en charge |
PARTITION BY |
Non pris en charge | Facultatif |
ASYNC / SYNC |
Facultatif | Facultatif |
Propriétés d'index WITH |
Facultatif | Facultatif |
Notes d'utilisation
Vous pouvez créer au maximum 3 index secondaires et 1 index de recherche par table large.
Type d'index (USING)
Utilisez le mot-clé USING pour spécifier le type d'index. S'il est omis, un index secondaire (KV) est créé par défaut.
**Valeur USING** |
Type d'index | Cas d'utilisation |
|---|---|---|
KV (ou omission) |
Index secondaire | Recherches d'égalité et de plage hors clé primaire. Une instance prend en charge au maximum 8 tâches de création d'index secondaire simultanées ; la neuvième demande échoue immédiatement |
SEARCH |
Index de recherche | Recherche en texte intégral, requêtes floues, filtrage multidimensionnel, agrégation et tri avec pagination. Aucune limite sur le nombre de tâches de création simultanées. Nécessite l'activation préalable de la fonctionnalité d'index de recherche — les nœuds de recherche et les nœuds Lindorm Tunnel Service (LTS) engendrent des frais. Consultez Activer les index de recherche. La clé d'index doit inclure au moins une colonne hors clé primaire. Types de données pris en charge : tous les types de base sauf DATE, TIME et DECIMAL. Consultez Types de données de base |
Expression de clé d'index (index_key_expression)
Définissez une ou plusieurs colonnes comme clés d'index. Un index comportant plusieurs clés d'index est un index composite.
Définition de clé d'index (index_key_definition)
Pour les index secondaires, chaque définition de clé peut être :
Un nom de colonne, éventuellement suivi de
DESCpour un ordre décroissantUne expression de fonction (Z-ORDER, S2, CAST, MD5 ou SHA256)
Pour les index de recherche, chaque définition de clé peut être :
Un nom de colonne avec des propriétés de clé d'index facultatives
La constante joker
*pour indexer toutes les colonnes existantes
Propriétés de clé d'index de recherche (option_definition)
Spécifiez les propriétés par colonne à l'aide de la syntaxe column(property=value, ...). Par exemple : c3(type=text, analyzer=ik). Vous pouvez également spécifier ces propriétés lors de l'ajout d'une colonne d'index à l'aide de l'instruction ALTER INDEX.
| Propriété | Type | Description |
|---|---|---|
indexed |
STRING | Indique si un index doit être construit pour cette colonne. Un index inversé est construit pour les colonnes de chaîne ; un index numérique BKD-Tree pour les colonnes numériques. Valeurs valides : true (par défaut) ou false |
rowStored |
STRING | Indique si la valeur brute de la colonne doit être stockée. Valeurs valides : true ou false (par défaut) |
columnStored |
STRING | Indique si le stockage en colonnes doit être utilisé pour accélérer le tri et l'analyse. Valeurs valides : true (par défaut) ou false |
type |
STRING | Définissez sur text pour les champs en texte intégral tokenisés. Doit être utilisé avec analyzer |
analyzer |
STRING | Tokeniseur pour les colonnes type=text. Valeurs valides : standard, english, ik, whitespace, comma. Doit être utilisé avec type |
mapping |
STRING | Propriétés personnalisées de clé d'index sous forme de chaîne JSON, compatible avec la syntaxe de mapping Elasticsearch. S'applique uniquement aux versions compatibles Elasticsearch. Remplace toutes les autres propriétés pour cette clé |
Expressions de fonction d'index secondaire (function_expression)
Lors de la création d'un index secondaire, vous pouvez spécifier une expression de fonction comme clé d'index.
Les expressions de fonction MD5 et SHA256 nécessitent LindormTable 2.6.7.5 ou une version ultérieure. Si vous ne pouvez pas effectuer la mise à niveau, contactez le support technique Lindorm sur DingTalk à l'adresse s0s3eg3.
| Fonction | Syntaxe | Cas d'utilisation |
|---|---|---|
| Z-ORDER | Z-ORDER(col1, col2, ...) |
Index secondaire spatio-temporel ; les colonnes doivent être d'un type de données spatio-temporel. Consultez Index spatio-temporels |
| S2 | S2(col, level) |
Index de grille S2 pour les colonnes POLYGON ou MULTIPOLYGON ; level varie de 1 à 30. Consultez Fonction d'index S2 |
| CAST | CAST(col AS type) |
Index sur le résultat d'une conversion de type de données. Consultez Types de données de base |
| MD5 | MD5(col) |
Index sur la valeur encodée MD5 d'une colonne VARCHAR. Nécessite LindormTable 2.6.7.5+. Consultez Fonction MD5 |
| SHA256 | SHA256(col) |
Index sur la valeur encodée SHA256 d'une colonne VARCHAR. Nécessite LindormTable 2.6.7.5+. Consultez Fonction SHA256 |
Constante joker (wildcard_string_literal)
Seuls les index de recherche prennent en charge la constante joker *. Utilisez * pour construire un index sur toutes les colonnes existantes au moment de l'exécution de l'instruction.
CREATE INDEX IF NOT EXISTS idx5 USING SEARCH ON test(*);
Les colonnes ajoutées après l'exécution de l'instruction ne sont pas automatiquement indexées. Ajoutez-les manuellement à l'aide de
ALTER INDEX.Les colonnes dynamiques ne sont pas incluses. Consultez Colonnes dynamiques.
Colonnes incluses (INCLUDE)
La clause INCLUDE ajoute des colonnes hors clé de la table principale dans la table d'index, formant ainsi un index couvrant. Les requêtes qui exploitent l'index peuvent récupérer les valeurs des colonnes incluses sans consulter la table principale, ce qui améliore les performances de lecture.
Pour les index secondaires, utilisez le mot-cléWITHpour inclure les colonnes dynamiques en définissantINDEX_COVERED_TYPE. Consultez Index secondaires .
Partition d'index (PARTITION BY)
Seuls les index de recherche prennent en charge le partitionnement d'index. Le serveur fractionne et stocke les données automatiquement. Au moment de la requête, le système applique l'élagage des partitions pour ignorer les partitions non pertinentes.
Types de partition pris en charge : RANGE et HASH. Consultez Index partitionnés.
Mode de création d'index (ASYNC | SYNC)
Spécifiez ASYNC ou SYNC pour contrôler le moment où l'instruction renvoie la main.
| Mode | Comportement | L'instruction bloque-t-elle ? | L'index est-il utilisable immédiatement après le retour de l'instruction ? | Cas d'utilisation |
|---|---|---|---|---|
ASYNC (par défaut depuis LindormTable 2.6.1) |
Renvoie la main immédiatement après le démarrage de la tâche de création | Non | Non — la création se poursuit en arrière-plan | Production ; les écritures continuent sans interruption pendant la création de l'index |
SYNC |
Renvoie la main uniquement après l'achèvement de la tâche de création | Oui | Oui | Scripts de migration de schéma ; tests ; cas où l'index doit être prêt avant l'étape suivante |
SYNC nécessite LindormTable 2.6.3 ou une version ultérieure.
Le tableau suivant indique les modes pris en charge par chaque type d'index.deuxindex secondaires et index de recherchedeux
| Mode de création | Index secondaire | Index de recherche |
|---|---|---|
ASYNC (par défaut depuis LindormTable 2.6.1) |
Pris en charge | Pris en charge |
SYNC (nécessite LindormTable 2.6.3+) |
Pris en charge | Pris en charge |
Mode de création d'index | Index secondaire | Index de recherche |
ASYNC Important À partir de LindormTable 2.6.1, le mode de création d'index par défaut pour l'instruction | 0 | 0 |
SYNC Important Seules les versions LindormTable 2.6.3 et ultérieures prennent en charge la création synchrone d'index. | 0 | ✔ |
Propriétés d'index (WITH)
Propriétés d'index secondaire
| Propriété | Type | Description |
|---|---|---|
COMPRESSION |
STRING | Algorithme de compression pour la table d'index. Valeurs valides : SNAPPY, ZSTD, LZ4 |
INDEX_COVERED_TYPE |
STRING | Méthode de redondance pour les colonnes incluses. COVERED_ALL_COLUMNS_IN_SCHEMA : inclut toutes les colonnes hors clé primaire prédéfinies. COVERED_DYNAMIC_COLUMNS : inclut toutes les colonnes hors clé primaire prédéfinies et les colonnes dynamiques. Lorsqu'elle est définie, omettez la clause INCLUDE. Avant d'inclure les colonnes dynamiques, activez la fonctionnalité de colonne dynamique. Consultez Colonnes dynamiques |
STARTKEY |
STRING | Clé de début pour la table d'index. Ne peut pas être définie pour les colonnes de type timestamp ou spatial |
ENDKEY |
STRING | Clé de fin pour la table d'index. Ne peut pas être définie pour les colonnes de type timestamp ou spatial |
NUMREGIONS |
INTEGER | Nombre de pré-partitions pour la table d'index. Ne peut pas être défini pour les colonnes de type timestamp ou spatial |
Propriétés d'index de recherche
| Propriété | Type | Description |
|---|---|---|
indexState |
STRING | État initial de l'index. Valeurs valides : ACTIVE (disponible), INACTIVE (indisponible), DISABLED (désactivé) |
numShards |
INTEGER | Nombre de shards. Par défaut : deux fois le nombre de nœuds de recherche. Maintenez chaque shard entre 30 et 100 millions de lignes et 30 à 50 Go. Un shard dépassant 2 milliards de lignes affecte la stabilité du système. Planifiez le nombre de shards avant de créer des index de production. Pour les données de séries chronologiques avec une croissance volumétrique significative (telles que les commandes ou les journaux), utilisez plutôt un index partitionné par temps |
RANGE_TIME_PARTITION_START |
INTEGER | Nombre de jours avant la création de l'index pour commencer à créer des partitions, pour les données historiques. Si les données historiques ont un horodatage antérieur à l'heure de début de partition, une erreur se produit. Obligatoire lors de la création d'un index partitionné par temps |
RANGE_TIME_PARTITION_INTERVAL |
INTEGER | Intervalle en jours entre les nouvelles partitions. Par exemple, 7 crée une nouvelle partition chaque semaine. Obligatoire lors de la création d'un index partitionné par temps |
RANGE_TIME_PARTITION_TTL |
INTEGER | Période de rétention des données en jours. Par exemple, 180 conserve six mois de données et efface automatiquement les partitions plus anciennes. Si non défini, les données ne sont jamais effacées. Obligatoire lors de la création d'un index partitionné par temps |
RANGE_TIME_PARTITION_MAX_OVERLAP |
INTEGER | Décalage maximal autorisé de l'horodatage futur en jours. Par défaut : 1 jour |
RANGE_TIME_PARTITION_FIELD_TIMEUNIT |
LONG | Unité du champ de partition temporelle. Par défaut : millisecondes (ms). Si l'unité est la seconde (s), la valeur du champ doit comporter 10 chiffres. Si l'unité est la milliseconde (ms), elle doit en comporter 13 |
RANGE_TIME_PARTITION_CHS |
INTEGER | Limite de séparation des données chaudes/froides en secondes. Par exemple, 864000 archive les données de plus de 10 jours vers le stockage froid. Si non défini, la séparation des données chaudes et froides n'est pas activée pour cet index |
INDEX_SETTINGS |
STRING | Propriétés personnalisées de l'index sous forme de chaîne JSON, compatible avec la syntaxe des paramètres d'index Elasticsearch. S'applique uniquement aux versions compatibles Elasticsearch |
SOURCE_SETTINGS |
STRING | Politique de stockage des données brutes pour les colonnes d'index, sous forme de chaîne JSON compatible avec les paramètres _source d'Elasticsearch. Par défaut, les index de recherche ne stockent pas les données brutes des colonnes. Configurez ce paramètre uniquement lorsque vous avez besoin de requêtes directes de données via l'interface utilisateur de visualisation du moteur de recherche. Consultez requêtes de données. Paramètres pris en charge : enabled (Booléen ; true stocke toutes les colonnes, false n'en stocke aucune ; ne peut pas être utilisé avec includes ou excludes), includes (tableau de chaînes ; colonnes dont les données brutes doivent être stockées ; prend en charge le joker *), excludes (tableau de chaînes ; colonnes dont les données brutes doivent être exclues ; prend en charge le joker *) |
Exemples
Tous les exemples utilisent la table principale suivante :
CREATE TABLE test (
p1 VARCHAR NOT NULL,
p2 INTEGER NOT NULL,
c1 BIGINT,
c2 DOUBLE,
c3 VARCHAR,
c4 TIMESTAMP,
c5 GEOMETRY(POINT),
PRIMARY KEY(p1, p2)
) WITH (CONSISTENCY = 'strong', MUTABILITY='MUTABLE_LATEST');
Index secondaires
Créer un index de manière asynchrone
Le mode par défaut est ASYNC. L'instruction renvoie la main immédiatement.
CREATE INDEX idx1 ON test(c1 DESC) INCLUDE(c3, c4) WITH (COMPRESSION='ZSTD');
Vérifiez le résultat :
SHOW INDEX FROM test;
Créer un index composite de manière synchrone
CREATE INDEX idx1 ON test(c1, c2, c3) INCLUDE(c4) SYNC WITH (COMPRESSION='ZSTD');
Vérifiez le résultat :
SHOW INDEX FROM test;
Créer un index secondaire spatio-temporel
CREATE INDEX idx ON roads (Z-ORDER(g1));
CREATE INDEX idt ON roads (Z-ORDER(g1, t));
Consultez Index spatio-temporels.
Inclure toutes les colonnes prédéfinies
CREATE INDEX idx1 ON test(c4 DESC) WITH (INDEX_COVERED_TYPE='COVERED_ALL_COLUMNS_IN_SCHEMA');
Vérifiez le résultat :
SHOW INDEX FROM test;
Inclure toutes les colonnes dynamiques
CREATE INDEX idx1 ON test(c4 DESC) WITH (INDEX_COVERED_TYPE='COVERED_DYNAMIC_COLUMNS');
Vérifiez le résultat :
SHOW INDEX FROM test;
Définir des pré-partitions pour la table d'index
Créez un index avec 32 pré-partitions.
CREATE INDEX idx1 ON test(c4 DESC) INCLUDE(c5, c6) WITH (NUMREGIONS='32');
Vérifiez le résultat :
SHOW INDEX FROM test;
Définir les clés de début et de fin avec des pré-partitions
Créez une table d'index avec 32 pré-partitions entre 11111111 et 9999999.
CREATE INDEX idx1 ON test(c3 DESC) INCLUDE(c5, c6)
WITH (NUMREGIONS='32', STARTKEY='11111111', ENDKEY='9999999');
Vérifiez le résultat :
SHOW INDEX FROM test;
Créer un index secondaire Z-ORDER
CREATE INDEX idx1 ON test(Z-ORDER(c5));
Vérifiez le résultat :
SHOW INDEX FROM test;
Créer un index secondaire de grille S2
Les index S2 ne prennent en charge que la création asynchrone. Exécutez BUILD INDEX pour déclencher la création après avoir créé l'index.
CREATE INDEX idx1 ON test(S2(c5, 10));
BUILD INDEX s2_idx ON test;
Vérifiez le résultat :
SHOW INDEX FROM test;
Indexer une colonne après une conversion de type de données
Convertissez la colonne c3 en INTEGER, puis créez un index secondaire sur le résultat.
CREATE INDEX idx1 ON test(CAST(c3 AS INTEGER));
Vérifiez le résultat :
SHOW INDEX FROM test;
Index de recherche
Créer un index de recherche de manière asynchrone
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(p1, p2, c1, c2, c3);
Vérifiez le résultat :
SHOW INDEX FROM test;
Pour surveiller la progression de la création, consultez Afficher la progression complète de la création d'un index de recherche .
Indexer toutes les colonnes
Si aucune propriété de colonne n'est spécifiée, les valeurs par défaut s'appliquent.
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*');
Pour surveiller la progression de la création, consultez Afficher la progression complète de la création d'un index de recherche .
Ajouter des propriétés de clé d'index
Indexez toutes les colonnes et configurez la colonne c3 pour la tokenisation IK :
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*', c3(type=text, analyzer=ik, indexed=true));
Pour utiliser un mapping personnalisé compatible Elasticsearch pour la colonne c3 :
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*', c3(mapping='{
"type": "text",
"analyzer": "ik_max_word"
}'));
Le paramètre mapping s'applique uniquement aux versions compatibles Elasticsearch et remplace toutes les autres propriétés de la colonne.
Pour surveiller la progression de la création, consultez Afficher la progression complète de la création d'un index de recherche .
Définir l'état de l'index et le nombre de shards
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(c1, c3(type=text, analyzer=ik))
WITH (indexState=ACTIVE, numShards=4);
Pour surveiller la progression de la création, consultez Afficher la progression complète de la création d'un index de recherche .
Définir des paramètres d'index personnalisés
Créez un index de recherche avec compression ZSTD et un intervalle d'actualisation de 10 secondes :
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(c1, c3(type=text, analyzer=ik))
WITH (indexState=ACTIVE, INDEX_SETTINGS='{
"index": {
"codec": "zstd",
"refresh_interval": "10s"
}
}');
Pour surveiller la progression de la création, consultez Afficher la progression complète de la création d'un index de recherche .
Créer un index de recherche partitionné par temps
Partitionnez par la colonne c4, en commençant il y a 30 jours, avec une nouvelle partition tous les 7 jours et une période de rétention de 90 jours.
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(c1, c2, c3, c4)
PARTITION BY RANGE TIME(c4) PARTITIONS 16
WITH (
indexState=ACTIVE,
RANGE_TIME_PARTITION_START='30',
RANGE_TIME_PARTITION_INTERVAL='7',
RANGE_TIME_PARTITION_TTL='90',
RANGE_TIME_PARTITION_MAX_OVERLAP='90'
);
Pour surveiller la progression de la création, consultez Afficher la progression complète de la création d'un index de recherche .
Stocker les données brutes dans l'index de recherche
Par défaut, les index de recherche filtrent les données mais ne stockent pas les valeurs brutes des colonnes. Activez le stockage des données brutes pour interroger directement via le moteur de recherche.
Stocker toutes les colonnes d'index :
CREATE INDEX idx2 USING SEARCH ON test(c1, c2, c3, c4)
WITH (SOURCE_SETTINGS='{
"enabled": true
}');
Vérifiez le résultat :
SHOW INDEX FROM test;
Stocker un sous-ensemble de colonnes (c2, c3, c4, en excluant c1) :
CREATE INDEX idx2 USING SEARCH ON test(c1, c2, c3, c4)
WITH (SOURCE_SETTINGS='{
"includes": ["c*"],
"excludes": ["c1"]
}');
Vérifiez le résultat :
SHOW INDEX FROM test;
Pour surveiller la progression de la création, consultez Afficher la progression complète de la création d'un index de recherche .