本記事では、SQLステートメントを使用してインデックスを作成する方法について説明します。また、インデックス作成の前提条件、インデックスの概要、制限事項および推奨事項などを紹介し、いくつかの例も示します。
説明
本記事では主に、CREATE INDEX ステートメントを使用したインデックスの作成方法について説明します(複数値インデックスは除く)。複数値インデックスは、テーブル作成時にのみ作成できます。その他のインデックス作成方法については、CREATE TABLE または ALTER TABLE ステートメントを参照してください。
インデックスの概要
インデックスは、セカンダリインデックスとも呼ばれ、オプションのテーブル構造です。OceanBaseデータベースは集約インデックステーブルモデルを採用しており、ユーザーが指定した主キーに対しては、システムが自動的に主キーインデックスを生成します。一方、ユーザーが作成するその他のインデックスは、セカンダリインデックスとなります。業務ニーズに応じて、特定のフィールドにインデックスを作成することで、それらのフィールドに関するクエリの実行速度を向上させることができます。
OceanBaseデータベースのインデックスに関する詳細情報については、インデックスの概要を参照してください。
前提条件
インデックスを作成する前に、以下の事項を確認してください:
OceanBaseクラスタをデプロイし、MySQLモードのテナントを作成していること。OceanBaseクラスタのデプロイに関する詳細は、デプロイの概要を参照してください。
OceanBaseデータベースのMySQLテナントに接続していること。データベースへの接続に関する詳細は、接続方法の概要を参照してください。
データベースを作成していること。データベースの作成に関する詳細は、データベースの作成を参照してください。
テーブルを作成していること。テーブルの作成に関する詳細は、テーブルの作成を参照してください。
INDEX権限を保有していること。現在のユーザー権限を確認する操作については、ユーザー権限の確認を参照してください。この権限がない場合は、管理者に連絡して権限の付与を依頼してください。ユーザー権限に関する操作については、直接権限の付与を参照してください。
インデックス作成の制限
OceanBaseデータベースでは、インデックス名はデータベース(DataBase)全体で一意である必要があります。
インデックス名の長さは64バイトを超えてはなりません。
唯一インデックスの使用制限:
1つのテーブルに複数の唯一インデックスを作成できますが、各唯一インデックスに対応する列値は一意である必要があります。
主キー以外の他の列の組み合わせがグローバルに一意である必要がある場合は、グローバル唯一インデックスを使用して実現します。
ローカル唯一インデックスを使用する場合、インデックスにはテーブルのパーティション関数に含まれるすべての列を含める必要があります。
グローバルインデックスを使用する場合、グローバルインデックスのパーティションルールは、必ずしもテーブルのパーティションルールと完全に同じである必要はありません。
空間インデックスの使用制限:
空間インデックスはローカルインデックスのみをサポートし、グローバルインデックスはサポートしていません。
空間インデックスを作成する列は
SRID属性を定義しておく必要があります。そうでない場合、その列に追加された空間インデックスは後続のクエリで有効になりません。SRIDに関する詳細は、空間参照システム(SRS)を参照してください。空間データ型のデータ列にのみ空間インデックスを作成できます。OceanBaseデータベースでサポートされている空間データ型については、空間データ型の概要を参照してください。
空間インデックスを作成する列の列属性は
NOT NULLでなければなりません。NOT NULLでない場合でも、ALTER TABLEステートメントを使用して、その列の列属性をNOT NULLに変更した後で空間インデックスを追加できます。列属性の変更手順の詳細については、列の制約タイプの定義を参照してください。OceanBaseデータベースは、
ALTER TABLEを使用して列のSRID属性を変更することは現在サポートしていないため、空間インデックスを有効にするには、テーブル作成時に空間列のSRID属性を定義しておく必要があります。
複数値インデックスの使用制限
各複数値インデックスは、複数値キー部分を1つのみ持つことができます。ただし、
CAST(... AS ... ARRAY)式は、次の例のようにJSONドキュメント内の複数の配列を参照できます:CAST(data->'$.arr[*][*]' AS UNSIGNED ARRAY)この場合、JSON式にマッチするすべての値は、インデックス内に単一の平面配列として格納されます。
複数値インデックスはカバリングインデックスにはできません。
複数値キー部分で許可されている唯一の式の種類はJSON式です。式はインデックス列に挿入されたJSONドキュメント内の既存の要素を参照する必要はありませんが、構文的に有効である必要があります。
同一のクラスタインデックスレコードのインデックスレコードが複数値インデックス内に分散しているため、複数値インデックスは範囲スキャンやインデックスのみのスキャンをサポートしません。
複数値インデックスは外部キースペシフィケーションでの使用を許可していません。
複数値インデックスにインデックスプレフィックスを定義することはできません。
Binary型のデータには複数値インデックスを定義できません。
フルテキストインデックスの使用制限と注意事項
パーティションテーブルと非パーティションテーブルに主キーがある場合とない場合の両方でフルテキストインデックスを作成できます。フルテキストインデックスの作成制限は以下のとおりです:
- フルテキストインデックスは
CHAR、VARCHAR、TEXT型の列にのみ適用できます。 - 現在のバージョンでは、ローカル(
LOCAL)フルテキストインデックスのみの作成がサポートされています。 - フルテキストインデックス作成時に
UNIQUEキーワードを指定することはできません。 - 複数列にまたがるフルテキストインデックスを作成する場合は、これらの列が同一の文字セットを持っていることを確認する必要があります。
- フルテキストインデックスは
インデックス作成に関する推奨事項
インデックスが対象とする列と用途を簡潔に表す名前の使用を推奨します。例:
idx_customer_name。その他の命名規則については、オブジェクト名付け規則の概要を参照してください。グローバルインデックスのパーティションルールとメインテーブルのパーティションルールが同じで、かつパーティション数も同じ場合は、ローカルインデックスを作成することを推奨します。
インデックス作成のためのSQLステートメントを並列に実行する件数は、テナントのUnit構成におけるCPUコア数の上限を超えないようにすることを推奨します。例えば、テナントのUnit構成が4コア(4C)の場合、並列で作成するインデックスは最大4つにすることを推奨します。
頻繁に更新されるテーブルに対しては、過度なインデックス作成を避け、クエリで頻繁に使用されるフィールドに対してのみインデックスを作成することを推奨します。
データ量が少ないテーブルでは、インデックスの使用を避けることを推奨します。データが少ないため、全データのクエリにかかる時間がインデックスを走査する時間よりも短くなる可能性があり、インデックスによる最適化効果が得られない場合があるためです。
更新処理のパフォーマンスが検索処理のパフォーマンスを大幅に上回る場合は、インデックスを作成することを推奨しません。
効率的なインデックスの作成:
インデックスには必要なクエリのすべての列を含めること。含まれる列が多いほど良く、これによりテーブルへの再アクセス回数を可能な限り減らすことができます。
等価条件は常に最初に置くこと。
データ量が多いフィルタリングやソート処理は、クエリの後半に配置すること。
コマンドラインでのインデックス作成
CREATE INDEX ステートメントを使用してインデックスを作成してください。
説明
SHOW INDEX FROM table_name; ステートメントを使用して、テーブル内のインデックス情報を確認できます。ここで、table_name はテーブル名です。
例
例1:一意インデックスを作成する
インデックス列に重複する値が存在しないようにしたい場合、一意インデックスを作成できます。
以下のSQLステートメントを使用して、tbl1 という名前のテーブルを作成し、テーブル tbl1 の col2 列に基づく一意インデックスを作成します。
テーブル
tbl1を作成します。obclient [test]> CREATE TABLE tbl1(col1 INT, col2 INT, col3 VARCHAR(50), PRIMARY KEY (col1));テーブル
tbl1のcol2列に基づいて、idx_tbl1_col2という名前の一意インデックスを作成します。obclient [test]> CREATE UNIQUE INDEX idx_tbl1_col2 ON tbl1(col2);テーブル
tbl1のインデックス情報を確認します。obclient [test]> SHOW INDEX FROM tbl1;実行結果は次のとおりです:
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl1 | 0 | PRIMARY | 1 | col1 | A | NULL | NULL | NULL | | BTREE | available | | YES | NULL | | tbl1 | 0 | idx_tbl1_col2 | 1 | col2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES | NULL | +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ 2 rows in set
例2:非一意インデックスを作成する
以下のSQLステートメントを使用して、tbl2 という名前のテーブルを作成し、テーブル tbl2 の col2 列に基づくインデックスを作成します。
テーブル
tbl2を作成します。obclient [test]> CREATE TABLE tbl2(col1 INT, col2 INT, col3 VARCHAR(50), PRIMARY KEY (col1));テーブル
tbl2のcol2列に基づいて、idx_tbl2_col2という名前のインデックスを作成します。obclient [test]> CREATE INDEX idx_tbl2_col2 ON tbl2(col2);テーブル
tbl2のインデックス情報を確認します。obclient [test]> SHOW INDEX FROM tbl2;実行結果は次のとおりです:
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl2 | 0 | PRIMARY | 1 | col1 | A | NULL | NULL | NULL | | BTREE | available | | YES | NULL | | tbl2 | 1 | idx_tbl2_col2 | 1 | col2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES | NULL | +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ 2 rows in set
例3:ローカルインデックスを作成する
ローカルインデックスはパーティションインデックスとも呼ばれ、LOCAL キーワードを使用して作成します。ローカルインデックスのパーティションキーはテーブルのパーティションキーと同じで、パーティション数も同じです。そのため、ローカルインデックスのパーティショニングメカニズムはテーブルのものと同一です。ローカルインデックスとローカル一意インデックスの作成がサポートされています。データの一意性を制約するためにローカル一意インデックスを使用する場合、そのインデックスにはテーブルのパーティションキーを含める必要があります。
以下のSQLステートメントを使用して、tbl3_rl という名前のサブパーティションテーブルを作成し、テーブル tbl3_rl に col1 列と col2 列に基づくローカル一意インデックスを作成します。
Range + Listサブパーティションテーブル
tbl3_rlを作成します。obclient [test]> CREATE TABLE tbl3_rl(col1 INT,col2 INT) PARTITION BY RANGE(col1) SUBPARTITION BY LIST(col2) (PARTITION p0 VALUES LESS THAN(100) (SUBPARTITION sp0 VALUES IN(1,3), SUBPARTITION sp1 VALUES IN(4,6), SUBPARTITION sp2 VALUES IN(7,9)), PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION sp3 VALUES IN(1,3), SUBPARTITION sp4 VALUES IN(4,6), SUBPARTITION sp5 VALUES IN(7,9)) );テーブル
tbl3_rlにcol1列とcol2列に基づいて、idx_tbl3_rl_col1_col2という名前のインデックスを作成します。obclient [test]> CREATE UNIQUE INDEX idx_tbl3_rl_col1_col2 ON tbl3_rl(col1,col2) LOCAL;テーブル
tbl3_rlのインデックス情報を確認します。obclient [test]> SHOW INDEX FROM tbl3_rl;実行結果は次のとおりです:
+---------+------------+-----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +---------+------------+-----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl3_rl | 0 | idx_tbl3_rl_col1_col2 | 1 | col1 | A | NULL | NULL | NULL | YES | BTREE | available | | YES | NULL | | tbl3_rl | 0 | idx_tbl3_rl_col1_col2 | 2 | col2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES | NULL | +---------+------------+-----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ 2 rows in set
例4:グローバルインデックスを作成する
グローバルインデックスを作成するためのキーワードは GLOBAL です。
以下のSQLステートメントを使用して、tbl4_h という名前のパーティションテーブルを作成し、テーブル tbl4_h の col2 列に基づくグローバルインデックスを作成します。
Hashパーティションのパーティションテーブル
tbl4_hを作成します。obclient [test]> CREATE TABLE tbl4_h(col1 INT PRIMARY KEY,col2 INT) PARTITION BY HASH(col1) PARTITIONS 5;テーブル
tbl4_hにcol2列に基づくRangeパーティションインデックスであるidx_tbl4_h_col2という名前のグローバルインデックスを作成します。obclient [test]> CREATE INDEX idx_tbl4_h_col2 ON tbl4_h(col2) GLOBAL PARTITION BY RANGE(col2) (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200), PARTITION p2 VALUES LESS THAN(300) );テーブル
tbl4_hのインデックス情報を確認します。obclient [test]> SHOW INDEX FROM tbl4_h;実行結果は次のとおりです:
+--------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +--------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl4_h | 0 | PRIMARY | 1 | col1 | A | NULL | NULL | NULL | | BTREE | available | | YES | NULL | | tbl4_h | 1 | idx_tbl4_h_col2 | 1 | col2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES | NULL | +--------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ 2 rows in set
例5:空間インデックスを作成する
空間インデックスは、空間データの処理と最適化に使用されるデータベースインデックスです。地理情報システム(GIS)や位置データのストレージおよびクエリで広く利用されています。OceanBaseデータベースでは、通常のインデックスを作成する際の構文を使用して空間インデックスを作成できますが、空間インデックスには SPATIAL キーワードを使用する必要があります。
以下のSQLステートメントを使用して、tbl5 という名前のテーブルを作成し、テーブル tbl5 の g 列に基づいた空間インデックスを作成します。
テーブル
tbl5を作成します。obclient [test]> CREATE TABLE tbl5(id INT,name VARCHAR(20),g GEOMETRY NOT NULL SRID 0);テーブル
tbl5のg列に基づいて、idx_tbl5_gという名前の空間インデックスを作成します。obclient [test]> CREATE INDEX idx_tbl5_g ON tbl5(g);テーブル
tbl5のインデックス情報を確認します。obclient [test]> SHOW INDEX FROM tbl5;実行結果は次のとおりです:
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl5 | 1 | idx_tbl5_g | 1 | g | A | NULL | NULL | NULL | | SPATIAL | available | | YES | NULL | +-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ 1 row in set
例6:関数インデックスを作成する
テーブルの1列または複数列の値に基づいて計算された結果に基づいて作成されるインデックスを関数インデックスと呼びます。関数インデックスは最適化技術の一種であり、クエリ時に一致する関数値を迅速に特定することができるため、重複した計算を回避し、クエリ効率を向上させることができます。
OceanBaseデータベースのMySQLモードでは、関数インデックスの式に制限があり、一部のシステム関数の式を関数インデックスとして使用することは禁止されています。具体的な関数のリストについては、関数インデックスがサポートするシステム関数のリストおよび関数インデックスがサポートしないシステム関数のリストを参照してください。
セッション変数の固定メカニズム
関数インデックスにおけるセッション変数の固定メカニズムは、インデックスの作成時と使用時の計算セマンティクスが完全に一致することを保証し、セッション環境の変化による「インデックスヒットだが結果が誤っている」という現象を回避します。
動作原理
関数インデックスを作成する際、システムは自動的にインデックス式を解析し、その式がどのセッション変数(例:time_zone、sql_mode、collation_connectionなど)に依存しているかを特定し、これらの変数の現在値をインデックスメタデータに保存します。
クエリが関数インデックスにヒットした場合:
- システムはインデックス式の
local_session_var_idに基づき、インデックス作成時に保存されたセッション変数のスナップショットを取得します。 - 式の型推論と計算では、保存された変数値を使用し、現在のセッション変数値は使用しません。
- 計算結果がインデックス作成時と完全に一致することを保証します。
対応するセッション変数
関数インデックスで固定がサポートされているセッション変数は以下のとおりです:
変数名 |
説明 |
適用モード |
|---|---|---|
time_zone |
タイムゾーン設定。時刻関連関数(NOW()、CURTIME()など)の結果に影響します | MySQL/Oracle |
sql_mode |
SQLモード。SQL構文の解析と実行動作に影響します | MySQL |
nls_date_format |
Oracleモードの日付フォーマット | Oracle |
nls_timestamp_format |
Oracleモードのタイムスタンプフォーマット | Oracle |
nls_timestamp_tz_format |
Oracleモードのタイムゾーン付きタイムスタンプフォーマット | Oracle |
collation_connection |
接続文字セットのソート規則。文字列比較と関数の結果に影響します | MySQL |
max_allowed_packet |
最大許容データパケットサイズ | MySQL |
ob_compatibility_version |
OceanBase互換バージョン番号 | MySQL/Oracle |
システムはインデックス式に基づいて、固定が必要な変数を動的に導出します。例えば、インデックス式に NOW() などの時間関数が含まれている場合、time_zone が固定されます。文字列関数が含まれている場合は、collation_connection が固定される可能性があります。
使用上の注意
可変式への依存の回避
システムはセッション変数を自動的に固定しますが、インデックス内でセッションに影響される関数の使用は可能な限り減らし、確定的な列を優先的に使用することを推奨します:
-- ❌ 不推奨(time_zoneに依存)
CREATE INDEX idx_now ON logs ((DATE(NOW())));
-- ✅ 推奨(確定的な列を使用)
CREATE INDEX idx_log_date ON logs ((DATE(log_time)));
セッション変数の手動管理は不要
システムはセッション変数の一貫性を自動的に処理するため、現在のセッション変数の変更が既に作成された関数インデックスの正確性に影響を与える心配はありません。クエリ時には、インデックス作成時に保存された変数スナップショットが自動的に使用されます。
以下のSQLステートメントを使用して、tbl6 という名前のテーブルを作成し、テーブル tbl6 の c_time 列に基づく関数インデックスを作成します。
テーブル
tbl6を作成します。obclient [test]> CREATE TABLE tbl6(id INT, name VARCHAR(18), c_time DATE);テーブル
tbl6にc_time列の年部分に基づいて、idx_tbl6_c_timeという名前のインデックスを作成します。obclient [test]> CREATE INDEX idx_tbl6_c_time ON tbl6((YEAR(c_time)));以下のSQLステートメントを使用すると、作成された関数インデックスを確認できます。
SHOW INDEX FROM tbl6;実行結果は次のとおりです:
obclient [test]> SHOW INDEX FROM tbl6; +-------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+----------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+----------------+ | tbl6 | 1 | idx_tbl6_c_time | 1 | SYS_NC19$ | A | NULL | NULL | NULL | YES | BTREE | available | | YES | year(`c_time`) | +-------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+----------------+ 1 row in set
例7:カラムストアインデックスを作成する
カラムストアインデックスは、カラム指向ストレージデータベース向けのインデックス構造であり、主にカラム指向ストレージのクエリパフォーマンスを最適化するために使用されます。
以下のSQLステートメントを使用してカラムストアインデックスを作成します。
tbl7 テーブルを作成した後、カラムストアインデックス idx1_tbl7_cg を作成します。
テーブル
tbl7を作成します。CREATE TABLE tbl7(id INT, name VARCHAR(20), age INT);テーブル
tbl7にカラムストアインデックスidx1_tbl7_cgを作成し、インデックステーブルにage列の冗長データを格納します。CREATE INDEX idx1_tbl7_cg ON tbl7(id) STORING(age) WITH COLUMN GROUP(each column);以下のSQLステートメントを使用すると、作成した関数インデックスを確認できます。
SHOW INDEX FROM tbl7;実行結果は次のとおりです:
+-------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl7 | 1 | idx1_tbl7_cg | 1 | id | A | NULL | NULL | NULL | YES | BTREE | available | | YES | NULL | +-------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
例8:複数値インデックスを作成する
複数値インデックスは、同一列に複数の値を格納できる場合に対処するための特殊なデータベースインデックスです。OceanBaseデータベースでは、テーブル作成時(CREATE TABLE)に複数値インデックスを事前に作成できます。現在、テーブル作成後に複数値インデックスを追加することはサポートされていませんが、ALTER TABLEステートメントを使用して既存のインデックスを削除できます。複数値インデックスを含む主表が作成されている場合、複雑なDML操作がサポートされます。
複数値インデックスの作成例:
テーブル
json_tbl1を作成し、同時に複数値インデックスidx1_json_tbl1を作成します。CREATE TABLE json_tbl1(col1 INT, col2 VARCHAR(18), col3 JSON, INDEX idx1_json_tbl1((CAST(col3->'$.ipcode' AS UNSIGNED ARRAY))) );以下のステートメントを使用して、テーブル
json_tbl1にテストデータを挿入します。INSERT INTO json_tbl1 VALUES(1, 'a1', '{"user":"Jk001","user_id":37,"ipcode":[94582,94536]}'), (2, 'a2', '{"user":"Jk002","user_id":22,"ipcode":[94568,94507,94582]}'), (3, 'a3', '{"user":"Jk003","user_id":31,"ipcode":[94477,94507]}'), (4, 'a4', '{"user":"Jk004","user_id":72,"ipcode":[94536]}'), (5, 'a5', '{"user":"Jk005","user_id":56,"ipcode":[94507,94582]}');
複数値インデックスの作成例:
テーブルjson_tbl2を作成し、同時に複合複数値インデックスidx1_json_tbl2を作成します。
CREATE TABLE json_tbl2(col1 INT, col2 VARCHAR(18), col3 JSON,
INDEX idx1_json_tbl2(col1, (CAST(col3->'$.ipcode' AS UNSIGNED ARRAY)))
);
例9:全文インデックスを作成する
例:
tbl8 テーブルを作成した後、全文インデックス ft_idx1_tbl8 を作成します。
テーブル
tbl8を作成します。CREATE TABLE tbl8(col1 INT, col2 VARCHAR(4096));テーブル
tbl8に全文インデックスft_idx1_tbl8を作成し、全文インデックスのトークナイザーをIKに指定します。同時にPARSER_PROPERTIESを使用してトークナイザーのプロパティを設定します。CREATE FULLTEXT INDEX ft_idx1_tbl8 ON tbl8(col2) WITH PARSER IK PARSER_PROPERTIES=(ik_mode='max_word');以下のSQLステートメントを使用して、作成された関数インデックスを確認できます。
SHOW INDEX FROM tbl8;実行結果は次のとおりです:
+-------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl8 | 1 | ft_idx1_tbl8 | 1 | col2 | A | NULL | NULL | NULL | YES | FULLTEXT | available | | YES | NULL | +-------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
次のステップ
インデックスを作成した後、クエリのパフォーマンス最適化が必要になる場合があります。SQLチューニングの詳細については、SQLチューニングの概要を参照してください。
関連ドキュメント
- インデックスの表示に関する詳細は、インデックスの表示を参照してください。
- インデックスの管理に関する詳細は、DROP INDEXおよびインデックスの削除を参照してください。
- 関数インデックスでサポートされているシステム関数の詳細については、関数インデックスでサポートされているシステム関数の一覧を参照してください。