AnalyticDB for MySQL は、半構造化データクエリ機能として JSON インデックスを提供し、半構造化データ処理を簡素化し、データクエリの効率を向上させます。このトピックでは、JSON インデックスと JSON 配列インデックスを作成する方法について説明します。
概要
AnalyticDB for MySQL は、JSON インデックスと JSON 配列インデックスをサポートしています。JSON 型の列に JSON インデックスまたは JSON 配列インデックスを作成できます。このようにして、データをクエリする際に、テーブル全体をスキャンしたり、JSON ドキュメント全体を解析したりする必要がなくなります。これにより、データクエリの効率が向上します。JSON インデックスは、ログ情報、構成ファイル、デバイス情報などの複雑な半構造化データが保存およびクエリされるシナリオに適しています。
使用上の注意
JSON インデックスと JSON 配列インデックスは、JSON 型の列に対してのみ作成できます。
各 JSON インデックスまたは JSON 配列インデックスには、1 つの JSON 列のみが含まれます。複数の列を JSON インデックスまたは JSON 配列インデックスに含めるには、複数の JSON インデックスまたは JSON 配列インデックスを作成します。
既存のテーブルに JSON インデックスまたは JSON 配列インデックスを作成する場合:
パーティション分割された XUANWU_V2 テーブルとパーティション分割されていない XUANWU_V2 テーブルの場合、作成された JSON インデックスまたは JSON 配列インデックスは BUILD ジョブを必要とせずにすぐに有効になります。
パーティション化されていない XUANWU テーブルの場合、作成された JSON インデックスまたは JSON 配列インデックスは、[BUILD] ジョブが完了した後でのみ有効になります。
パーティション化された XUANWU テーブルの場合、作成された JSON インデックスまたは JSON 配列インデックスは、テーブル全体に対して実行される BUILD ジョブが完了した後でのみ有効になります。
JSON インデックスの作成
JSON インデックスを作成する際には、以下の点に注意してください。
V3.1.5.10 以降の AnalyticDB for MySQL クラスターの場合、テーブルの作成後に JSON インデックスは自動的に作成されません。JSON インデックスを手動で作成する必要があります。
V3.1.5.10 より前の AnalyticDB for MySQL クラスターの場合、テーブルの作成後に JSON 列に対して JSON インデックスが自動的に作成されます。
AnalyticDB for MySQL クラスターのマイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。
テーブルの作成時に JSON インデックスを作成する
使用上の注意
テーブルの作成時に 1 つ以上の列を指定してインデックスを作成する場合、AnalyticDB for MySQL は、テーブル内の他の列のインデックスを自動的に作成しません。
構文
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テーブルのvjJSON 列の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テーブルのvjJSON 列のnameプロパティキーに JSON インデックスを作成します。ALTER TABLE json_test ADD KEY index_vj_key(vj->'$.name');
JSON 配列インデックスの作成配列インデックス
V 3.1.10.6 以降の AnalyticDB for MySQL クラスターのみが JSON 配列インデックスをサポートしています。JSON 配列インデックスを作成した後、JSON_CONTAINS 関数と JSON_OVERLAPS 関数を使用してデータをクエリし、クエリの効率を向上させることができます。
AnalyticDB for MySQL クラスターの マイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。
使用上の注意
AnalyticDB for MySQL は、JSON 配列内の数値要素と文字列要素に対してのみインデックスを作成でき、配列内の他のタイプの要素 (ネストされた配列やオブジェクトなど) に対してはインデックスを作成できません。
テーブルの作成時に JSON 配列インデックスを作成する
構文
CREATE TABLE table_name(
column_name column_type,
{INDEX|KEY} [index_name](column_name->'$[*]')
)
DISTRIBUTED BY HASH(column_name);パラメーター
パラメーター | 説明 |
index_name | JSON 配列インデックスの名前。 重要 インデックス名は一意である必要があります。 |
column_name->'$[*]' |
|
例
json_test テーブルの JSON 型の vj 列に JSON 配列インデックスを作成します。
CREATE TABLE json_test(
id int,
vj json,
index idx_vj_array(vj->'$[*]')
)
DISTRIBUTED BY HASH(id);既存のテーブルに JSON 配列インデックスを作成する
構文
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')パラメーター
パラメーター | 説明 |
db_name | データベースの名前。 |
table_name | テーブルの名前。 |
index_name | JSON 配列インデックスの名前。 重要 インデックス名は一意である必要があります。 |
column_name->'$[*]' |
|
例
json_test テーブルの JSON 型の vj 列に JSON 配列インデックスを作成します。
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 配列インデックスを削除します。ALTER TABLE adb_demo.customer DROP KEY index_vj;