Los índices JSON permiten consultar campos específicos dentro de columnas JSON sin necesidad de examinar toda la tabla ni analizar sintácticamente cada documento JSON. AnalyticDB for MySQL admite dos tipos de índice para columnas JSON: índices JSON para búsquedas de clave/valor e índices de matriz JSON para consultas de pertenencia a matrices mediante JSON_CONTAINS y JSON_OVERLAPS.
Requisitos de versión
|
Función |
Versión mínima |
|
Índice JSON (creación manual obligatoria) |
V3.1.5.10 |
|
Índice JSON en una clave de propiedad ( |
V3.1.6.8 |
|
Índice de matriz JSON |
V3.1.10.6 |
Para consultar o actualizar la versión menor de su clúster, vaya a AnalyticDB for MySQL console, abra la página Cluster Information y localice la sección Configuration Information.
Elección del tipo de índice adecuado
|
Tipo de índice |
Recomendado para |
Funciones compatibles |
|
Índice JSON |
Búsquedas exactas de clave/valor en propiedades de objetos |
— |
|
Índice de matriz JSON |
Consultas de pertenencia en matrices JSON |
|
Cada índice JSON o índice de matriz JSON abarca una sola columna JSON. Para indexar varias columnas, cree un índice independiente para cada una.
Notas de uso
Los índices JSON y los índices de matriz JSON solo se pueden crear en columnas de tipo JSON.
Los índices de matriz JSON solo admiten elementos numéricos y de cadena. No es posible indexar matrices anidadas ni objetos.
En clústeres con la versión V3.1.5.10 o posterior, los índices JSON no se crean automáticamente al crear una tabla. Debe crearlos manualmente con la sintaxis que se muestra a continuación.
En clústeres con versiones anteriores a la V3.1.5.10, los índices JSON se crean automáticamente para las columnas JSON después de la creación de la tabla.
Activación del índice tras la creación (tablas existentes)
Al agregar un índice JSON o un índice de matriz JSON a una tabla existente, el comportamiento de activación depende del motor de almacenamiento:
|
Tipo de tabla |
Activación |
|
Tablas XUANWU_V2 particionadas y no particionadas |
Surte efecto de inmediato. No se requiere ningún trabajo de BUILD. |
|
Tablas XUANWU no particionadas |
Surte efecto una vez completado un trabajo de BUILD. |
|
Tablas XUANWU particionadas |
Surte efecto al finalizar un proceso de BUILD job run on the entire table. |
Creación de un índice JSON
Todos los ejemplos de esta sección utilizan una tabla devices que almacena telemetría de dispositivos en formato JSON:
CREATE TABLE devices(
id int,
info json,
...
)
DISTRIBUTED BY HASH(id);
Un valor típico de info tiene el siguiente aspecto:
{"device_id": "d-001", "status": "online", "tags": ["prod", "us-west"]}
Crear un índice JSON al crear una tabla
Si especifica una o más columnas para crear un índice durante la creación de la tabla, AnalyticDB for MySQL no crea índices automáticamente para las demás columnas de la tabla.
Sintaxis
CREATE TABLE table_name(
column_name column_type,
{INDEX|KEY} [index_name](column_name|column_name->'$.json_path')
)
DISTRIBUTED BY HASH(column_name)
La sintaxis column_name->'$.json_path' utiliza la notación JSONPath: $ hace referencia a la raíz del documento JSON y .key accede a una propiedad del objeto. Este parámetro requiere la versión V3.1.6.8 o posterior.
Parámetros
|
Parámetro |
Descripción |
|
|
Nombre del índice. Debe ser único dentro de la tabla. |
|
|
Nombre de la columna JSON que se va a indexar. Crea un índice sobre todo el documento JSON. |
|
|
Columna JSON y una clave de propiedad específica. Cada índice abarca una clave de propiedad. |
Para otros parámetros de CREATE TABLE, consulte CREATE TABLE.
Si una columna JSON ya tiene un índice, elimínelo antes de crear un índice de clave de propiedad en la misma columna.
Ejemplos
Indexar toda la columna JSON info:
CREATE TABLE devices(
id int,
info json,
index idx_info(info)
)
DISTRIBUTED BY HASH(id);
Indexar únicamente la clave de propiedad status (requiere la versión V3.1.6.8 o posterior):
CREATE TABLE devices(
id int,
info json,
index idx_info_status(info->'$.status')
)
DISTRIBUTED BY HASH(id);
Crear un índice JSON en una tabla existente
Sintaxis
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path',...)
Parámetros
|
Parámetro |
Descripción |
|
|
Nombre de la base de datos. |
|
|
Nombre de la tabla. |
|
|
Nombre del índice. Debe ser único dentro de la tabla. |
|
|
Nombre de la columna JSON que se va a indexar. |
|
|
Columna JSON y una clave de propiedad específica. Requiere la versión V3.1.6.8 o posterior. |
Si una columna JSON ya tiene un índice, elimínelo antes de crear un índice de clave de propiedad en la misma columna.
Ejemplos
Indexar toda la columna JSON info:
ALTER TABLE devices ADD KEY idx_info(info);
Indexar únicamente la clave de propiedad status:
ALTER TABLE devices ADD KEY idx_info_status(info->'$.status');
Creación de un índice de matriz JSON
Los índices de matriz JSON aceleran las consultas de pertenencia en matrices JSON mediante JSON_CONTAINS y JSON_OVERLAPS. Este tipo de índice requiere la versión V3.1.10.6 o posterior.
La expresión JSONPath $[*] coincide con todos los elementos de una matriz JSON.
Los índices de matriz JSON solo admiten elementos de matriz numéricos y de cadena. No es posible indexar matrices anidadas ni objetos.
Crear un índice de matriz JSON al crear una tabla
Sintaxis
CREATE TABLE table_name(
column_name column_type,
{INDEX|KEY} [index_name](column_name->'$[*]')
)
DISTRIBUTED BY HASH(column_name);
Parámetros
|
Parámetro |
Descripción |
|
|
Nombre del índice. Debe ser único dentro de la tabla. |
|
|
Columna JSON que se va a indexar. |
Ejemplo
Indexar la columna de matriz info en la tabla devices:
CREATE TABLE devices(
id int,
info json,
index idx_info_tags(info->'$[*]')
)
DISTRIBUTED BY HASH(id);
Crear un índice de matriz JSON en una tabla existente
Sintaxis
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')
Parámetros
|
Parámetro |
Descripción |
|
|
Nombre de la base de datos. |
|
|
Nombre de la tabla. |
|
|
Nombre del índice. Debe ser único dentro de la tabla. |
|
|
Columna JSON que se va a indexar. |
Ejemplo
Agregar un índice de matriz JSON en la columna info de la tabla devices:
ALTER TABLE devices ADD KEY idx_info_tags(info->'$[*]');
Eliminación de un índice
Sintaxis
ALTER TABLE db_name.table_name DROP KEY index_name
Para obtener el nombre del índice, ejecute:
SHOW INDEX FROM db_name.table_name;
Ejemplos
Eliminar el índice idx_info de la tabla devices:
ALTER TABLE mydb.devices DROP KEY idx_info;
Eliminar el índice de matriz JSON idx_info_tags de la tabla devices:
ALTER TABLE mydb.devices DROP KEY idx_info_tags;
Pasos siguientes
JSON: Referencia del tipo de datos JSON para AnalyticDB for MySQL.
JSON functions: Funciones JSON compatibles con AnalyticDB for MySQL, incluidas
JSON_CONTAINSyJSON_OVERLAPS.