JSON索引

更新时间:2025-03-31 02:16:17

为降低处理半结构化数据的难度,提升查询效率,AnalyticDB for MySQL提供了半结构化数据检索功能,即JSON索引。本文主要介绍如何创建JSON索引和JSON Array索引。

JSON索引介绍

AnalyticDB for MySQL支持创建JSON索引和JSON Array索引。通过为存储在JSON列中的数据创建JSON索引或JSON Array索引,可以避免在查询数据时扫描全表数据或对整个JSON文档进行解析,从而提升数据查询效率。JSON索引主要适用于存储和查询复杂半结构化数据的场景,例如日志信息、配置文件、设备信息等。

注意事项

  • JSON索引和JSON Array索引的列数据类型必须为JSON。

  • 一个JSON索引或JSON Array索引仅能包含一个JSON列。如需对多个JSON列创建索引,可创建多个JSON索引或JSON Array索引。

  • 为已有表创建JSON索引或JSON_Arrary索引时:

    • XUANWU_V2(分区表和非分区表),创建JSON索引或JSON Array索引后,无需BUILD,索引立即生效。

    • XUANWU非分区表,创建JSON索引或JSON Array索引后,需要BUILD,待BUILD完成后索引才能生效。

    • XUANWU分区表,创建JSON索引或JSON Array索引后,必须手动强制全表BUILD,待BUILD完成后索引才能生效。

创建JSON索引

创建JSON索引时,您还需注意以下内容:

  • 3.1.5.10及以上内核版本的集群,创建表后不会自动创建JSON索引,您需手动创建JSON索引。

  • 3.1.5.10以下内核版本的集群,创建表后会自动为JSON列创建JSON索引。

说明

云原生数据仓库AnalyticDB MySQL控制台集群信息页面的配置信息区域,查看和升级内核版本

创建表时创建JSON索引
为已存在的表创建JSON索引

注意事项

若您在建表时手动指定为某一列或某几列创建INDEX索引,AnalyticDB for MySQL不会再为表中其他列自动创建INDEX索引。

语法

CREATE TABLE table_name(
  column_name column_type,
  {INDEX|KEY} [index_name](column_name|column_name->'$.json_path')
)
DISTRIBUTED BY HASH(column_name)

参数说明

参数

说明

index_name

JSON索引名称。

重要

索引名称唯一,不能相同。

column_name|column_name->'$.json_path'

  • column_name:JSON索引的列。

  • column_name->'$.json_path':JSON索引的列及其指定的属性键。每一个JSON索引只能有一个JSON列的一个属性键。

    重要

建表语句的其他参数,请参见CREATE TABLE

示例

  • json_test表中的JSONvj创建JSON索引。

    CREATE TABLE json_test(
      id int,
      vj json,
      index idx_vj(vj)
    )
    DISTRIBUTED BY HASH(id);
  • json_test表中JSONvj的属性键name创建JSON索引。

    CREATE TABLE json_test(
      id int,
      vj json COMMENT 
      index idx_vj_path(vj->'$.name')
    )
    DISTRIBUTED BY HASH(id);

语法

ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path',...)

参数说明

参数

说明

db_name

数据库名称。

table_name

表名称。

index_name

JSON索引名称。

重要

索引名称唯一,不能相同。

column_name|column_name->'$.json_path'

  • column_name:JSON索引的列。

  • column_name->'$.json_path':JSON索引的列及其指定的属性键。每一个JSON索引只能有一个JSON列的一个属性键。

    重要

示例

  • json_test表中的JSONvj创建JSON索引。

    ALTER TABLE json_test ADD KEY index_vj(vj);
  • json_test表中JSONvj的属性键name创建JSON索引。

    ALTER TABLE json_test ADD KEY index_vj_key(vj->'$.name');

创建JSON Array索引

3.1.10.6及以上内核版本的集群支持创建JSON Array索引。创建JSON Array索引后,您可以使用JSON_CONTAINSJSON_OVERLAPS函数检索数据,提高数据查询效率。

说明

云原生数据仓库AnalyticDB MySQL控制台集群信息页面的配置信息区域,查看和升级内核版本

注意事项

创建JSON Array索引时,AnalyticDB for MySQL仅会为数组中的数值和字符串类型元素构建索引,不会为数组中的其他类型(例如嵌套数组、对象等)元素构建索引。

创建表时创建JSON Array索引
为已存在的表创建JSON Array索引

语法

CREATE TABLE table_name(
  column_name column_type,
  {INDEX|KEY} [index_name](column_name->'$[*]')
)
DISTRIBUTED BY HASH(column_name);

参数说明

参数

说明

index_name

JSON Array索引名称。

重要

索引名称唯一,不能相同。

column_name->'$[*]'

column_nameJSON Array索引的列。例如:vj->'$[*]'表示为vj列创建JSON Array索引。

示例

json_test表中的JSONvj创建JSON Array索引。

CREATE TABLE json_test(
  id int,
  vj json,
  index idx_vj_array(vj->'$[*]')
)
DISTRIBUTED BY HASH(id);

语法

ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')

参数说明

参数

说明

db_name

数据库名称。

table_name

表名称。

index_name

JSON Array索引名称。

重要

索引名称唯一,不能相同。

column_name->'$[*]'

column_nameJSON Array索引的列。例如:vj->'$[*]'表示为vj列创建JSON Array索引。

示例

json_test表中的JSONvj创建JSON Array索引。

ALTER TABLE json_test ADD KEY index_vj(vj->'$[*]');

删除索引

语法

ALTER TABLE db_name.table_name DROP KEY index_name

参数说明

index_name:普通索引名称。您通过SHOW INDEX FROM db_name.table_name;查询index_name

示例

  • 删除customer表中名为age_idx的索引。

    ALTER TABLE adb_demo.customer DROP KEY age_idx;
  • 删除json_test表中名为index_vjJSON Array索引。

    ALTER TABLE adb_demo.customer DROP KEY index_vj;

相关文档

  • JSON:了解JSON类型。

  • JSON函数AnalyticDB for MySQL支持使用的JSON函数。

  • 本页导读 (1)
  • JSON索引介绍
  • 注意事项
  • 创建JSON索引
  • 创建JSON Array索引
  • 删除索引
  • 相关文档
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等