全部產品
Search
文件中心

AnalyticDB:JSON索引

更新時間:Nov 05, 2024

為降低處理半結構化資料的難度,提升查詢效率,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'

  • column_name:JSON索引的列。

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

    重要
    • 僅3.1.6.8及以上核心版本的叢集支援column_name->'$.json_path

      • 查看湖倉版叢集的核心版本,請執行SELECT adb_version();。如需升級核心版本,請聯絡支援人員。

      • 查看和升級數倉版叢集的核心版本,請參見查看和升級版本

    • 為JSON列中的指定屬性鍵建立索引時,若該JSON列已存在INDEX索引,需先刪除該列的INDEX索引,否則會報錯。

建表語句的其他參數,請參見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'

  • column_name:JSON索引的列。

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

    重要
    • 僅3.1.6.8及以上核心版本的叢集支援column_name->'$.json_path

      • 查看湖倉版叢集的核心版本,請執行SELECT adb_version();。如需升級核心版本,請聯絡支援人員。

      • 查看和升級數倉版叢集的核心版本,請參見查看和升級版本

    • 為JSON列中的指定屬性鍵建立索引時,若該JSON列已存在INDEX索引,需先刪除該列的INDEX索引,否則會報錯。

樣本

  • 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->'$[*]'

column_name為JSON Array索引的列。例如:vj->'$[*]'表示為vj列建立JSON Array索引。

樣本

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->'$[*]'

column_name為JSON Array索引的列。例如:vj->'$[*]'表示為vj列建立JSON Array索引。

樣本

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函數