JSON索引
為降低處理半結(jié)構(gòu)化數(shù)據(jù)的難度,提升查詢效率,AnalyticDB for MySQL提供了半結(jié)構(gòu)化數(shù)據(jù)檢索功能,即JSON索引。本文主要介紹如何創(chuàng)建JSON索引和JSON Array索引。
JSON索引介紹
AnalyticDB for MySQL支持創(chuàng)建JSON索引和JSON Array索引。通過為存儲在JSON列中的數(shù)據(jù)創(chuàng)建JSON索引或JSON Array索引,可以避免在查詢數(shù)據(jù)時掃描全表數(shù)據(jù)或?qū)φ麄€JSON文檔進(jìn)行解析,從而提升數(shù)據(jù)查詢效率。JSON索引主要適用于存儲和查詢復(fù)雜半結(jié)構(gòu)化數(shù)據(jù)的場景,例如日志信息、配置文件、設(shè)備信息等。
注意事項
JSON索引和JSON Array索引的列數(shù)據(jù)類型必須為JSON。
一個JSON索引或JSON Array索引僅能包含一個JSON列。如需對多個JSON列創(chuàng)建索引,可創(chuàng)建多個JSON索引或JSON Array索引。
創(chuàng)建JSON索引
創(chuàng)建JSON索引時,您還需注意以下內(nèi)容:
3.1.5.10及以上內(nèi)核版本的集群,創(chuàng)建表后不會自動創(chuàng)建JSON索引,您需手動創(chuàng)建JSON索引。
3.1.5.10以下內(nèi)核版本的集群,創(chuàng)建表后會自動為JSON列創(chuàng)建JSON索引。
查看企業(yè)版或湖倉版集群的內(nèi)核版本,請執(zhí)行SELECT adb_version();
。如需升級內(nèi)核版本,請聯(lián)系技術(shù)支持。
創(chuàng)建表時創(chuàng)建JSON索引
注意事項
若您在建表時手動指定為某一列或某幾列創(chuàng)建INDEX索引,AnalyticDB for MySQL不會再為表中其他列自動創(chuàng)建INDEX索引。
語法
CREATE TABLE table_name(
column_name column_type,
{INDEX|KEY} [index_name](column_name|column_name->'$.json_path')
)
DISTRIBUTED BY HASH(column_name)
參數(shù)說明
參數(shù) | 說明 |
index_name | JSON索引名稱。 重要 索引名稱唯一,不能相同。 |
column_name|column_name->'$.json_path' |
|
建表語句的其他參數(shù),請參見CREATE TABLE。
示例
為
json_test
表中的JSON列vj
創(chuàng)建JSON索引。CREATE TABLE json_test( id int, vj json, index idx_vj(vj) ) DISTRIBUTED BY HASH(id);
為
json_test
表中JSON列vj
的屬性鍵name
創(chuàng)建JSON索引。CREATE TABLE json_test( id int, vj json COMMENT index idx_vj_path(vj->'$.name') ) DISTRIBUTED BY HASH(id);
為已存在的表創(chuàng)建JSON索引
語法
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path',...)
參數(shù)說明
參數(shù) | 說明 |
db_name | 數(shù)據(jù)庫名稱。 |
table_name | 表名稱。 |
index_name | JSON索引名稱。 重要 索引名稱唯一,不能相同。 |
column_name|column_name->'$.json_path' |
|
示例
為
json_test
表中的JSON列vj
創(chuàng)建JSON索引。ALTER TABLE json_test ADD KEY index_vj(vj);
為
json_test
表中JSON列vj
的屬性鍵name
創(chuàng)建JSON索引。ALTER TABLE json_test ADD KEY index_vj_key(vj->'$.name');
創(chuàng)建JSON Array索引
僅3.1.10.6及以上內(nèi)核版本的集群支持創(chuàng)建JSON Array索引。創(chuàng)建JSON Array索引后,您可以使用JSON_CONTAINS和JSON_OVERLAPS函數(shù)檢索數(shù)據(jù),提高數(shù)據(jù)查詢效率。
注意事項
創(chuàng)建JSON Array索引時,AnalyticDB for MySQL僅會為數(shù)組中的數(shù)值和字符串類型元素構(gòu)建索引,不會為數(shù)組中的其他類型(例如嵌套數(shù)組、對象等)元素構(gòu)建索引。
創(chuàng)建表時創(chuàng)建JSON Array索引
語法
CREATE TABLE table_name(
column_name column_type,
{INDEX|KEY} [index_name](column_name->'$[*]')
)
DISTRIBUTED BY HASH(column_name);
參數(shù)說明
參數(shù) | 說明 |
index_name | JSON Array索引名稱。 重要 索引名稱唯一,不能相同。 |
column_name->'$[*]' |
|
示例
為json_test
表中的JSON列vj
創(chuàng)建JSON Array索引。
CREATE TABLE json_test(
id int,
vj json,
index idx_vj_array(vj->'$[*]')
)
DISTRIBUTED BY HASH(id);
為已存在的表創(chuàng)建JSON Array索引
注意事項
使用ALTER TABLE語句創(chuàng)建JSON Array索引,需要等待BUILD完成后,JSON Array索引才能生效。自動BUILD、手動BUILD以及BUILD任務(wù)的進(jìn)度,請參見BUILD。
語法
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')
參數(shù)說明
參數(shù) | 說明 |
db_name | 數(shù)據(jù)庫名稱。 |
table_name | 表名稱。 |
index_name | JSON Array索引名稱。 重要 索引名稱唯一,不能相同。 |
column_name->'$[*]' |
|
示例
為json_test
表中的JSON列vj
創(chuàng)建JSON Array索引。
ALTER TABLE json_test ADD KEY index_vj(vj->'$[*]');
刪除索引
語法
ALTER TABLE db_name.table_name DROP KEY index_name
參數(shù)說明
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_vj
的JSON Array索引。ALTER TABLE adb_demo.customer DROP KEY index_vj;
相關(guān)文檔
如何檢索JSON數(shù)據(jù),請參見JSON函數(shù)。