Les index JSON permettent d'interroger des champs spécifiques au sein de colonnes JSON sans analyser l'intégralité de la table ni parcourir chaque document JSON. AnalyticDB for MySQL prend en charge deux types d'index pour les colonnes JSON : les index JSON pour les recherches par clé/valeur et les index de tableau JSON pour les requêtes d'appartenance à un tableau, à l'aide des fonctions JSON_CONTAINS et JSON_OVERLAPS.
Prérequis de version
| Fonctionnalité | Version minimale |
|---|---|
| Index JSON (création manuelle requise) | V3.1.5.10 |
Index JSON sur une clé de propriété (column->'$.path') |
V3.1.6.8 |
| Index de tableau JSON | V3.1.10.6 |
Pour afficher ou mettre à jour la version mineure de votre cluster, accédez à la console AnalyticDB for MySQL, ouvrez la page Cluster Information et repérez la section Configuration Information.
Choisir le type d'index approprié
| Type d'index | Cas d'utilisation idéal | Fonctions prises en charge |
|---|---|---|
| Index JSON | Recherches exactes de clés/valeurs sur les propriétés d'objets | — |
| Index de tableau JSON | Requêtes d'appartenance sur les tableaux JSON | JSON_CONTAINS, JSON_OVERLAPS |
Chaque index JSON ou index de tableau JSON couvre une seule colonne JSON. Pour indexer plusieurs colonnes, créez un index distinct pour chacune.
Remarques sur l'utilisation
Les index JSON et les index de tableau JSON ne peuvent être créés que sur des colonnes de type JSON.
Les index de tableau JSON prennent uniquement en charge les éléments numériques et les chaînes. Les tableaux et objets imbriqués ne peuvent pas être indexés.
Pour les clusters exécutant la version V3.1.5.10 ou ultérieure, les index JSON ne sont pas créés automatiquement lors de la création d'une table. Créez-les manuellement à l'aide de la syntaxe ci-dessous.
Pour les clusters exécutant des versions antérieures à V3.1.5.10, les index JSON sont créés automatiquement pour les colonnes JSON après la création de la table.
Activation de l'index après sa création (tables existantes)
Lorsque vous ajoutez un index JSON ou un index de tableau JSON à une table existante, le comportement d'activation dépend du moteur de stockage :
| Type de table | Activation |
|---|---|
| Tables XUANWU_V2 partitionnées et non partitionnées | Prise d'effet immédiate. Aucune tâche BUILD n'est requise. |
| Tables XUANWU non partitionnées | Prise d'effet après l'achèvement d'une tâche BUILD. |
| Tables XUANWU partitionnées | Prise d'effet après l'achèvement d'une tâche BUILD exécutée sur l'ensemble de la table. |
Créer un index JSON
Tous les exemples de cette section utilisent une table devices qui stocke la télémétrie des appareils au format JSON :
CREATE TABLE devices(
id int,
info json,
...
)
DISTRIBUTED BY HASH(id);
Une valeur info typique se présente comme suit :
{"device_id": "d-001", "status": "online", "tags": ["prod", "us-west"]}
Créer un index JSON lors de la création d'une table
Si vous spécifiez une ou plusieurs colonnes pour créer un index lors de la création d'une table, AnalyticDB for MySQL ne crée pas automatiquement d'index pour les autres colonnes de la table.
Syntaxe
CREATE TABLE table_name(
column_name column_type,
{INDEX|KEY} [index_name](column_name|column_name->'$.json_path')
)
DISTRIBUTED BY HASH(column_name)
La syntaxe column_name->'$.json_path' utilise la notation JSONPath : $ fait référence à la racine du document JSON, et .key permet d'accéder à une propriété d'objet. Ce paramètre nécessite la version V3.1.6.8 ou ultérieure.
Paramètres
| Paramètre | Description |
|---|---|
index_name |
Nom de l'index. Il doit être unique au sein de la table. |
column_name |
Nom de la colonne JSON à indexer. Crée un index sur l'ensemble du document JSON. |
column_name->'$.json_path' |
Colonne JSON et clé de propriété spécifique. Chaque index couvre une seule clé de propriété. |
Pour les autres paramètres de CREATE TABLE , consultez la documentation CREATE TABLE.
Si une colonne JSON possède déjà un index, supprimez-le avant de créer un index sur une clé de propriété pour cette même colonne.
Exemples
Indexez l'intégralité de la colonne JSON info :
CREATE TABLE devices(
id int,
info json,
index idx_info(info)
)
DISTRIBUTED BY HASH(id);
Indexez uniquement la clé de propriété status (nécessite la version V3.1.6.8 ou ultérieure) :
CREATE TABLE devices(
id int,
info json,
index idx_info_status(info->'$.status')
)
DISTRIBUTED BY HASH(id);
Créer un index JSON sur une table existante
Syntaxe
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path',...)
Paramètres
| Paramètre | Description |
|---|---|
db_name |
Nom de la base de données. |
table_name |
Nom de la table. |
index_name |
Nom de l'index. Il doit être unique au sein de la table. |
column_name |
Nom de la colonne JSON à indexer. |
column_name->'$.json_path' |
Colonne JSON et clé de propriété spécifique. Nécessite la version V3.1.6.8 ou ultérieure. |
Si une colonne JSON possède déjà un index, supprimez-le avant de créer un index sur une clé de propriété pour cette même colonne.
Exemples
Indexez l'intégralité de la colonne JSON info :
ALTER TABLE devices ADD KEY idx_info(info);
Indexez uniquement la clé de propriété status :
ALTER TABLE devices ADD KEY idx_info_status(info->'$.status');
Créer un index de tableau JSON
Les index de tableau JSON accélèrent les requêtes d'appartenance sur les tableaux JSON à l'aide des fonctions JSON_CONTAINS et JSON_OVERLAPS. Ce type d'index nécessite la version V3.1.10.6 ou ultérieure.
L'expression JSONPath $[*] correspond à tous les éléments d'un tableau JSON.
Les index de tableau JSON prennent uniquement en charge les éléments de tableau numériques et les chaînes. Les tableaux et objets imbriqués ne peuvent pas être indexés.
Créer un index de tableau JSON lors de la création d'une table
Syntaxe
CREATE TABLE table_name(
column_name column_type,
{INDEX|KEY} [index_name](column_name->'$[*]')
)
DISTRIBUTED BY HASH(column_name);
Paramètres
| Paramètre | Description |
|---|---|
index_name |
Nom de l'index. Il doit être unique au sein de la table. |
column_name->'$[*]' |
Colonne JSON à indexer. $[*] sélectionne tous les éléments du tableau. Par exemple, info->'$[*]' crée un index de tableau sur la colonne info. |
Exemple
Indexez la colonne de tableau info dans la table devices :
CREATE TABLE devices(
id int,
info json,
index idx_info_tags(info->'$[*]')
)
DISTRIBUTED BY HASH(id);
Créer un index de tableau JSON sur une table existante
Syntaxe
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')
Paramètres
| Paramètre | Description |
|---|---|
db_name |
Nom de la base de données. |
table_name |
Nom de la table. |
index_name |
Nom de l'index. Il doit être unique au sein de la table. |
column_name->'$[*]' |
Colonne JSON à indexer. $[*] sélectionne tous les éléments du tableau. |
Exemple
Ajoutez un index de tableau JSON sur la colonne info de la table devices :
ALTER TABLE devices ADD KEY idx_info_tags(info->'$[*]');
Supprimer un index
Syntaxe
ALTER TABLE db_name.table_name DROP KEY index_name
Pour trouver le nom de l'index, exécutez la commande suivante :
SHOW INDEX FROM db_name.table_name;
Exemples
Supprimez l'index idx_info de la table devices :
ALTER TABLE mydb.devices DROP KEY idx_info;
Supprimez l'index de tableau JSON idx_info_tags de la table devices :
ALTER TABLE mydb.devices DROP KEY idx_info_tags;
Étapes suivantes
JSON : Référence du type de données JSON pour AnalyticDB for MySQL.
Fonctions JSON : Fonctions JSON prises en charge par AnalyticDB for MySQL, y compris
JSON_CONTAINSetJSON_OVERLAPS.