為降低處理半結構化資料的難度,提升查詢效率,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索引時,您還需注意以下內容:
3.1.5.10及以上核心版本的叢集,建立表後不會自動建立JSON索引,您需手動建立JSON索引。
3.1.5.10以下核心版本的叢集,建立表後會自動為JSON列建立JSON索引。
查看湖倉版叢集的核心版本,請執行SELECT adb_version();
。如需升級核心版本,請聯絡支援人員。
建立表時建立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' |
|
建表語句的其他參數,請參見CREATE TABLE。
樣本
為
json_test
表中的JSON列vj
建立JSON索引。CREATE TABLE json_test( id int, vj json, index idx_vj(vj) ) DISTRIBUTED BY HASH(id);
為
json_test
表中JSON列vj
的屬性鍵name
建立JSON索引。CREATE TABLE json_test( id int, vj json COMMENT index idx_vj_path(vj->'$.name') ) DISTRIBUTED BY HASH(id);
為已存在的表建立JSON索引
文法
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' |
|
樣本
為
json_test
表中的JSON列vj
建立JSON索引。ALTER TABLE json_test ADD KEY index_vj(vj);
為
json_test
表中JSON列vj
的屬性鍵name
建立JSON索引。ALTER TABLE json_test ADD KEY index_vj_key(vj->'$.name');
建立JSON Array索引
僅3.1.10.6及以上核心版本的叢集支援建立JSON Array索引。建立JSON Array索引後,您可以使用JSON_CONTAINS和JSON_OVERLAPS函數檢索資料,提高資料查詢效率。
注意事項
建立JSON Array索引時,AnalyticDB for MySQL僅會為數組中的數值和字串類型元素構建索引,不會為數組中的其他類型(例如嵌套數組、對象等)元素構建索引。
建立表時建立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->'$[*]' |
|
樣本
為json_test
表中的JSON列vj
建立JSON Array索引。
CREATE TABLE json_test(
id int,
vj json,
index idx_vj_array(vj->'$[*]')
)
DISTRIBUTED BY HASH(id);
為已存在的表建立JSON Array索引
注意事項
使用ALTER TABLE語句建立JSON Array索引,需要等待BUILD完成後,JSON Array索引才會生效。自動BUILD、手動BUILD以及BUILD任務的進度,請參見BUILD。
文法
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')
參數說明
參數 | 說明 |
db_name | 資料庫名稱。 |
table_name | 表名稱。 |
index_name | JSON Array索引名稱。 重要 索引名稱唯一,不能相同。 |
column_name->'$[*]' |
|
樣本
為json_test
表中的JSON列vj
建立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_vj
的JSON Array索引。ALTER TABLE adb_demo.customer DROP KEY index_vj;
相關文檔
如何檢索JSON資料,請參見JSON函數。