本記事では、インデックスを作成する方法について説明します。
背景
OceanBaseデータベースでは、パーティションテーブルとパーティションテーブル以外の両方にインデックスを作成できます。インデックスはローカルインデックスまたはグローバルインデックス、一意インデックスまたは非一意インデックス、空間インデックスまたは関数ベースのインデックスにすることができます。パーティションテーブルの一意インデックスの場合、ローカルの一意インデックスにはテーブルパーティションのパーティションキーを含める必要があります。インデックスの詳細については、インデックスの概要セクションを参照してください。
このセクションでは主に、パーティションテーブル以外のテーブルにインデックスを作成する方法について説明します。パーティションテーブルへのインデックス作成については、パーティションテーブルにインデックスを作成するセクションを参照してください。
注意事項
インデックスを作成する際には、OceanBaseデータベースにおいて、インデックス名がデータベース(DataBase)範囲内で重複してはならないことに注意する必要があります。
通常インデックスの作成
CREATE TABLE ステートメント、CREATE INDEX ステートメント、または ALTER TABLE ステートメントを使用して通常インデックスを作成できます。
CREATE TABLE ステートメントを使用した通常インデックスの作成
CREATE TABLE ステートメントを使用して、テーブル作成時に同時にインデックスを作成できます。
構文は以下のとおりです:
CREATE TABLE [TEMPORARY] table_name(column_name column_definition,[column_name column_definition,...] [UNIQUE] INDEX|KEY [index_name](column_name));
関連パラメータの説明は以下のとおりです:
TEMPORARY: オプション。作成されるテーブルが一時テーブルであることを示します。table_name: 作成するテーブルの名前を指定します。column_name: テーブルの列を指定します。column_definition: テーブル内の各列に対応するデータ型を定義します。UNIQUE: オプション。一意のインデックスを示します。一意のインデックスを作成する場合は、このキーワードを追加する必要があります。INDEX|KEY: このステートメントでは、インデックスキーワードとしてINDEXまたはKEYのいずれかを使用できることを示します。index_name: オプション。作成するインデックスの名前を指定します。指定されていない場合、デフォルトのインデックス名は指定された列名と同じになります。
テーブル tbl1 を作成し、同時にインデックス tbl1_idx1 を作成する例は以下のとおりです:
CREATE TABLE tbl1(id INT,name VARCHAR(18),date DATE,PRIMARY KEY (id),INDEX tbl1_idx1 (date));
CREATE INDEX ステートメントを使用した通常インデックスの作成
CREATE INDEX ステートメントを使用して、既存のテーブルにインデックスを作成できます。
構文は以下のとおりです:
CREATE [UNIQUE] INDEX index_name ON table_name (column_name);
関連パラメータの説明は以下のとおりです:
UNIQUE: オプション。一意のインデックスを示します。一意のインデックスを作成する場合は、このキーワードを追加する必要があります。index_name: 追加するインデックスの名前を指定します。table_name: インデックスを作成するテーブルの名前を指定します。column_name: どの列にインデックスを付けるかを指定します。複数の列を指定する場合は、各列を英字のカンマで区切ります。
テーブル tbl2 を作成した後、インデックス tbl2_idx1 を作成する例は以下のとおりです:
テーブル
tbl2を作成します。CREATE TABLE tbl2(id INT,name VARCHAR(20));テーブル
tbl2にインデックスtbl2_idx1を作成します。CREATE INDEX tbl2_idx1 ON tbl2(id);
ALTER TABLE ステートメントを使用した通常インデックスの作成
ALTER TABLE ステートメントを使用して、既存のテーブルにインデックスを作成でき、このステートメントは一度に複数のインデックスを追加することをサポートしています。
構文は以下のとおりです:
ALTER TABLE table_name ADD [UNIQUE] INDEX|KEY [index_name](column_name);
関連パラメータの説明は以下のとおりです:
table_name: インデックスを作成するテーブルの名前を指定します。UNIQUE: オプション。一意のインデックスを示します。一意のインデックスを作成する場合は、このキーワードを追加する必要があります。INDEX|KEY: このステートメントでは、インデックスキーワードとしてINDEXまたはKEYのいずれかを使用できることを示します。index_name: オプション。作成するインデックスの名前を指定します。指定されていない場合、デフォルトのインデックス名は指定された列名と同じになります。column_name: どの列にインデックスを付けるかを指定します。複数の列を指定する場合は、各列を英字のカンマで区切ります。
テーブル tbl3 を作成した後、インデックス tbl3_idx1 を作成する例は以下のとおりです:
テーブル
tbl3を作成します。CREATE TABLE tbl3(id INT,name VARCHAR(20));テーブル
tbl3にインデックスtbl3_idx1を作成します。ALTER TABLE tbl3 ADD INDEX tbl3_idx1(id);
スペースインデックスの作成
OceanBaseデータベースのMySQLモードでは、スペースインデックスを作成できます。スペースインデックスとは、メディア上に格納されたデータの位置情報を記述したものであり、システムによるデータ取得の効率を向上させるために使用されます。
スペースインデックスを作成する構文は、通常のインデックスを作成する構文と基本的に同じであり、CREATE TABLE ステートメント、CREATE INDEX ステートメント、または ALTER TABLE ステートメントを使用してインデックスを作成します。異なる点として、スペースインデックスでは SPATIAL キーワードを使用する必要があり、またスペースインデックス内の列は NOT NULL である必要があります。
空間インデックスの使用制限
空間インデックスを作成する前に、以下の使用制限を理解しておく必要があります:
空間インデックスはローカルインデックスのみをサポートし、グローバルインデックスはサポートされていません。
空間インデックスを作成する列は、
SRIDプロパティとして定義する必要があります。そうでない場合、その列に追加された空間インデックスは後続のクエリで有効になりません。これは、空間インデックスを作成した後、空間インデックスを使用して比較する際には、列定義に記述されているSRIDに対応する座標系を使用する必要があるためです。空間インデックスは、幾何オブジェクトの最小境界矩形(MBR)に基づいて構築されており、MBR の比較方法もSRIDに依存します。SRID に関する詳細は、空間参照システム(SRS)を参照してください。
空間データ型のデータ列にのみ空間インデックスを作成できます。OceanBaseデータベースがサポートする空間データ型については、空間データ型の概要を参照してください。
空間インデックスを作成する列の列プロパティは
NOT NULLである必要があります。NOT NULLでない場合でも、ALTER TABLEステートメントを使用して、まずその列の列プロパティをNOT NULLに変更した後、空間インデックスを追加することができます。列プロパティの変更手順の詳細については、列の制約タイプの定義を参照してください。
CREATE TABLE ステートメントを使用して空間インデックスを作成する
構文は以下のとおりです:
CREATE TABLE table_name(column_g_name GEOMETRY NOT NULL SRID 4326,[column_name column_definition,...] SPATIAL INDEX|KEY [index_name](column_g_name));
関連パラメータの説明は以下のとおりです:
table_name:作成するテーブルの名前を指定します。column_g_name、column_name:テーブルの列名を定義します。SRID 4326:指定された空間列のSRIDを表示します。column_definition:テーブル内の各列に対応するデータ型を定義します。空間インデックスを追加する列の列型は空間データ型である必要があります。OceanBaseデータベースがサポートする空間データ型については、空間データ型の概要を参照してください。INDEX|KEY:このステートメントでは、インデックスキーワードとしてINDEXまたはKEYのいずれかを使用できることを示します。index_name:追加するインデックスの名前を指定します。指定されていない場合、デフォルトのインデックス名は指定された列名と同じになります。
tbl1_g テーブルを作成し、同時に空間インデックス tbl1_g_idx1 を追加する例は以下のとおりです:
CREATE TABLE tbl1_g (id INT,name VARCHAR(18),g GEOMETRY NOT NULL SRID 4326,SPATIAL INDEX tbl1_g_idx1(g));
作成後、SHOW INDEX ステートメントを使用してインデックス情報を確認できます。
SHOW INDEX FROM tbl1_g;
クエリ結果は次のとおりです:
+--------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible |
+--------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
| tbl1_g | 1 | tbl1_g_idx1 | 1 | g | A | NULL | NULL | NULL | | SPATIAL | available | | YES |
+--------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
1 row in set
CREATE INDEX ステートメントを使用して空間インデックスを作成する
構文は以下のとおりです:
CREATE SPATIAL INDEX index_name ON table_name(column_g_name);
関連パラメータの説明は以下のとおりです:
table_name:インデックスを作成するテーブルの名前を指定します。index_name:追加するインデックスの名前を指定します。column_g_name:どの列にインデックスを付けるかを指定します。複数の列を指定する場合は、各列を英字のカンマで区切ります。空間インデックスを追加する列の型は、空間データ型である必要があります。OceanBaseデータベースがサポートする空間データ型については、空間データ型の概要を参照してください。
tbl2_g テーブルを作成した後、空間インデックス tbl2_g_idx1 を作成する例は以下のとおりです:
テーブル
tbl2_gを作成します。CREATE TABLE tbl2_g(id INT,name VARCHAR(20),g GEOMETRY NOT NULL SRID 4326);テーブルに空間インデックス
tbl2_g_idx1を作成します。CREATE SPATIAL INDEX tbl2_g_idx1 ON tbl2_g(g);作成が成功したら、インデックス情報を確認します。
SHOW INDEX FROM tbl2_g;クエリ結果は次のとおりです:
+--------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | +--------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ | tbl2_g | 1 | tbl2_g_idx1 | 1 | g | A | NULL | NULL | NULL | | SPATIAL | available | | YES | +--------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ 1 row in set
ALTER TABLE ステートメントを使用して空間インデックスを作成する
ALTER TABLE table_name ADD SPATIAL INDEX|KEY [index_name](column_g_name);
関連パラメータの説明は以下のとおりです:
table_name:インデックスを作成するテーブルの名前を指定します。INDEX|KEY:このステートメントでは、インデックスキーワードにINDEXまたはKEYを使用できることを示します。index_name:オプション。追加するインデックスの名前を指定します。指定されていない場合、デフォルトのインデックス名は指定された列名と同じになります。column_g_name:どの列にインデックスを作成するかを指定します。複数の列を指定する場合は、各列を英字のカンマで区切ります。空間インデックスを追加する列の列型は、空間データ型である必要があります。OceanBaseデータベースがサポートする空間データ型については、空間データ型の概要を参照してください。
tbl3_g テーブルを作成した後、空間インデックス tbl3_g_idx1 を作成する例は次のとおりです:
テーブル
tbl3_gを作成します。CREATE TABLE tbl3_g(id INT,name VARCHAR(20),g GEOMETRY NOT NULL SRID 4326);テーブルに空間インデックスを作成します。
ALTER TABLE tbl3_g ADD SPATIAL INDEX tbl3_g_idx1(g);インデックス情報を確認します。
SHOW INDEX FROM tbl3_g;クエリ結果は次のとおりです:
+--------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | +--------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ | tbl3_g | 1 | tbl3_g_idx1 | 1 | g | A | NULL | NULL | NULL | | SPATIAL | available | | YES | +--------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ 1 row in set
関数ベースのインデックスの作成
テーブル内の1列または複数の列の値に基づいて計算された結果を用いて構築されるインデックスを関数ベースのインデックスと呼びます。関数ベースのインデックスは最適化技術の一種であり、関数ベースのインデックスを使用することでクエリ時にマッチする関数値を迅速に特定し、重複計算を回避してクエリ効率を向上させることができます。
例えば、データ型が date の列 date_col を持つテーブル sale があるとします。
CREATE TABLE sale(date_col date, sales_col int, name_col varchar(10));
3月のデータを取得する必要がある場合、Month() 関数を使用してデータを照会できます。
SELECT * FROM sale WHERE month(date_col) = 3;
このシナリオでは、データベースはテーブル内の各行に対して month(date_col) を計算し、month(date_col) = 3 に一致しない行をフィルタリングする必要があります。頻繁に月情報を使用してデータをフィルタリングする必要がある場合、毎回 month(date_col) を再計算する必要があり、これにより大量のオーバーヘッドが発生します。そのため、date_col に関数ベースのインデックスを作成し、month(date_col) をインデックステーブルに格納することで、クエリを高速化できます。
CREATE INDEX idx1 ON sale((month(date_col)));
CREATE TABLE ステートメント、CREATE INDEX ステートメント、または ALTER TABLE ステートメントを使用して関数ベースのインデックスを作成できます。関数ベースのインデックスは一意インデックスまたは空間インデックスにすることもできます。
関数ベースのインデックスの使用制限
OceanBaseデータベースのMySQLモードでは、関数ベースのインデックスの式に制限があり、一部のシステム関数の式を関数ベースのインデックスとして使用することは禁止されています。具体的な関数の一覧については、関数ベースのインデックスでサポートされるシステム関数のリストおよび関数ベースのインデックスでサポートされないシステム関数のリストを参照してください。
CREATE TABLE ステートメントを使用して関数ベースのインデックスを作成する
テーブル作成時に同時に関数ベースのインデックスを作成できます。構文は以下のとおりです:
CREATE TABLE table_name({column_name column_definition,[column_name column_definition,...]} [UNIQUE| SPATIAL] {INDEX|KEY} [index_name](expr));
関連パラメータの説明は以下のとおりです:
table_name:インデックスを作成するテーブルの名前を指定します。column_definition:テーブル内の各列のデータ型を定義します。[UNIQUE | SPATIAL]:オプション。UNIQUEは一意インデックスを、SPATIALは空間インデックスを表します。一意インデックスまたは空間インデックスを作成する場合は、対応するキーワードを追加する必要があります。INDEX|KEY:このステートメントでは、インデックスキーワードとしてINDEXまたはKEYのいずれかを使用できることを示します。index_name:オプション。作成する関数ベースのインデックスの名前です。指定しない場合、システムが自動的に名前を生成します。形式はfunctional_index_xxで、xxはインデックス番号です。expr:有効な関数ベースのインデックス式であり、ブール式も許可されます。例えば、c1=c1などです。
関数ベースのインデックス tbl1_func_idx1 を作成する例は以下のとおりです:
CREATE TABLE tbl1_func (c1 int, c2 int, index tbl1_func_idx1 ((c1+1)), UNIQUE KEY ((c1+c2)));
作成が成功した後、SHOW CREATE TABLE ステートメントを使用してテーブル作成ステートメントを確認できます。ステートメントは次のとおりです:
SHOW CREATE TABLE tbl1_func;
クエリ結果は次のとおりです:
+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl1_func | CREATE TABLE `tbl1_func` (
`c1` int(11) DEFAULT NULL,
`c2` int(11) DEFAULT NULL,
UNIQUE KEY `functional_index` ((`c1` + `c2`)) BLOCK_SIZE 16384 LOCAL,
KEY `tbl1_func_idx1` ((`c1` + 1)) BLOCK_SIZE 16384 LOCAL
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 |
+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
CREATE INDEX ステートメントを使用して関数ベースのインデックスを作成する
テーブルの作成が成功した後、既存のテーブルに関数ベースのインデックスを作成できます。構文は以下のとおりです:
CREATE [UNIQUE | SPATIAL] INDEX index_name ON table_name (expr);
関連パラメータの説明は以下のとおりです:
[UNIQUE | SPATIAL]:オプション。UNIQUEは一意インデックスを表し、SPATIALは空間インデックスを表します。一意インデックスまたは空間インデックスを作成する場合は、対応するキーワードを追加する必要があります。index_name:作成する関数ベースのインデックスの名前。table_name:インデックスを作成するテーブル。expr:有効な関数ベースのインデックス式であり、c1=c1のようなブール式も許可されます。
テーブルに c1+c2 < 1 と定義された関数ベースのインデックス tbl2_func_idx1 を作成する例:
テーブル
tbl2_funcを作成します。CREATE TABLE tbl2_func(c1 int, c2 int);関数ベースのインデックス
tbl2_func_idx1を作成します。CREATE INDEX tbl2_func_idx1 on tbl2_func ((c1+c2 < 1));作成が成功したら、作成された関数ベースのインデックスを確認できます。
SHOW INDEX FROM tbl2_func;結果は次のとおりです:
+-----------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+---------------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-----------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+---------------------+ | tbl2_func | 1 | tbl2_func_idx1 | 1 | SYS_NC18$ | A | NULL | NULL | NULL | YES | BTREE | available | | YES | ((`c1` + `c2`) < 1) | +-----------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+---------------------+ 1 row in set
ALTER TABLE ステートメントを使用して関数ベースのインデックスを作成する
構文は以下のとおりです:
ALTER TABLE table_name ADD [UNIQUE | SPATIAL] {INDEX | KEY} [index_name](expr);
関連パラメータの説明は以下のとおりです:
table_name:インデックスを作成する対象のテーブル。[UNIQUE | SPATIAL]:オプション。UNIQUEは一意インデックスを、SPATIALは空間インデックスを示します。一意インデックスまたは空間インデックスを作成する場合は、対応するキーワードを追加する必要があります。INDEX|KEY:このステートメントにおいて、インデックスキーワードとしてINDEXまたはKEYのいずれかを使用できることを示します。index_name:オプション。作成する関数ベースのインデックスの名前。指定しない場合、システムが自動的に名前を生成し、その形式はfunctional_indexプレフィックスに番号を付けたものになります。expr:有効な関数ベースのインデックス式であり、ブール式(例えばc1=c1)も許可されます。
テーブル
tbl3_funcを作成します。CREATE TABLE tbl3_func(c1 int, c2 int);テーブルに2つの関数ベースのインデックスを作成します。
ALTER TABLE tbl3_func ADD INDEX ((c1+1));ALTER TABLE tbl3_func ADD INDEX ((concat(c1,'a')));インデックス情報を確認します。
SHOW INDEX FROM tbl3_func;クエリ結果は次のとおりです:
+-----------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-----------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------------+ | tbl3_func | 1 | functional_index | 1 | SYS_NC18$ | A | NULL | NULL | NULL | YES | BTREE | available | | YES | (`c1` + 1) | | tbl3_func | 1 | functional_index_2 | 1 | SYS_NC19$ | A | NULL | NULL | NULL | YES | BTREE | available | | YES | concat(`c1`,'a') | +-----------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------------+ 2 rows in set
カラムストアインデックスの作成
CREATE TABLE ステートメント、CREATE INDEX ステートメント、または ALTER TABLE ステートメントを使用してカラムストアインデックスを作成できます。
CREATE TABLEステートメントを使用したカラムストアインデックスの作成
CREATE TABLE ステートメントを使用して、テーブル作成時に同時にカラムストアインデックスを作成できます。
構文は以下のとおりです:
CREATE TABLE table_name(column_name column_definition,[column_name column_definition,...] [UNIQUE] INDEX|KEY [index_name](column_name) [STORING(column_name, ...)] WITH COLUMN GROUP([all columns, ]each column));
関連パラメータの説明は以下のとおりです:
table_name:作成するテーブルの名前を指定します。column_name:テーブルの列を指定します。column_definition:テーブル内の各列に対応するデータ型を定義します。UNIQUE:オプション。一意のインデックスを示します。一意のインデックスを作成する場合は、このキーワードを追加する必要があります。INDEX|KEY:このステートメントにおいて、インデックスキーワードとしてINDEXまたはKEYのいずれかを使用できることを示します。index_name:オプション。作成するインデックスの名前を指定します。指定されていない場合、デフォルトのインデックス名は指定された列名と同じになります。STORING(column_name, ...):オプション。インデックステーブル上の冗長列を指定します。column_name列がインデックスフィールドでない場合でも、カラムストア形式で冗長ストレージされます。WITH COLUMN GROUP([all columns, ]each column):インデックスのカラムストア属性を指定します。WITH COLUMN GROUP(all columns, each column):行ストアとカラムストアの冗長インデックスを作成することを指定します。WITH COLUMN GROUP(all columns):行ストアインデックスを作成することを指定します。WITH COLUMN GROUP(each column):カラムストアインデックスを作成することを指定します。
例:
テーブル
tbl4を作成し、同時に行ストアとカラムストアの冗長インデックスidx1_tbl4_cgも作成します。CREATE TABLE tbl4(id INT, name VARCHAR(18), date DATE, PRIMARY KEY (id), INDEX idx1_tbl4_cg (date) WITH COLUMN GROUP(all columns, each column));テーブル
tbl5を作成し、同時にカラムストアインデックスidx1_tbl5_cgを作成するとともに、インデックステーブル上にid列の冗長データを格納します。CREATE TABLE tbl5(id INT, name VARCHAR(18), date DATE, INDEX idx1_tbl5_cg (date) STORING(id) WITH COLUMN GROUP(each column));
CREATE INDEXステートメントを使用してカラムストアインデックスを作成する
CREATE INDEX ステートメントを使用して、既存のテーブルにカラムストアインデックスを作成できます。
構文は以下のとおりです:
CREATE [UNIQUE] INDEX index_name ON table_name (column_name) [STORING(column_name, ...)] WITH COLUMN GROUP([all columns, ]each column);
関連パラメータの説明は以下のとおりです:
UNIQUE:オプション。一意のインデックスを示します。一意のインデックスを作成する場合は、このキーワードを追加する必要があります。index_name:追加するインデックスの名前を指定します。table_name:インデックスを作成するテーブルの名前を指定します。column_name:どの列にインデックスを付けるかを指定します。複数の列を指定する場合は、各列を英語のカンマで区切ります。STORING(column_name, ...):オプション。インデックステーブル上の冗長列を指定します。column_name列がインデックスフィールドでなくても、カラムストア形式で冗長ストレージされます。WITH COLUMN GROUP([all columns, ]each column):インデックスのカラムストア属性を指定します。WITH COLUMN GROUP(all columns, each column):行ストアとカラムストアの冗長インデックスを作成することを指定します。WITH COLUMN GROUP(all columns):行ストアインデックスを作成することを指定します。WITH COLUMN GROUP(each column):カラムストアインデックスを作成することを指定します。
例:
tbl6 テーブルを作成した後、カラムストアインデックス idx1_tbl6_cg を作成します。
テーブル
tbl6を作成します。CREATE TABLE tbl6(id INT, name VARCHAR(20), age INT);テーブル
tbl6にカラムストアインデックスidx1_tbl6_cgを作成し、インデックステーブル上にage列の冗長データを格納します。CREATE INDEX idx1_tbl6_cg ON tbl6(id) STORING(age) WITH COLUMN GROUP(each column);
ALTER TABLEステートメントを使用したカラムストアインデックスの作成
既存のテーブルに対して、ALTER TABLE ステートメントを使用してカラムストアインデックスを作成できます。
構文は以下のとおりです:
ALTER TABLE table_name ADD [UNIQUE] INDEX|KEY [index_name](column_name) [STORING(column_name, ...)] WITH COLUMN GROUP([all columns, ]each column);
関連パラメータの説明は以下のとおりです:
table_name: インデックスを作成するテーブルの名前を指定します。UNIQUE: オプション。一意のインデックスを示します。一意のインデックスを作成する場合は、このキーワードを追加する必要があります。INDEX|KEY: このステートメントでは、インデックスキーワードとしてINDEXまたはKEYのいずれかを使用できることを示します。index_name: オプション。作成するインデックスの名前を指定します。指定されていない場合、デフォルトのインデックス名は指定された列名と同じになります。column_name: インデックスを付ける列を指定します。複数の列を指定する場合は、各列を英字のカンマで区切ります。STORING(column_name, ...): オプション。インデックステーブル上の冗長列を指定します。column_name列がインデックスフィールドでない場合でも、カラムストア形式で冗長ストレージされます。WITH COLUMN GROUP([all columns, ]each column): インデックスのカラムストア属性を指定します。WITH COLUMN GROUP(all columns, each column): 行ストアとカラムストアの冗長インデックスを作成することを指定します。WITH COLUMN GROUP(all columns): 行ストアインデックスを作成することを指定します。WITH COLUMN GROUP(each column): カラムストアインデックスを作成することを指定します。
例:
テーブル tbl7 を作成した後、カラムストアインデックス idx1_tbl6_cg を作成します。
テーブル
tbl7を作成します。CREATE TABLE tbl7(id INT, name VARCHAR(20), age INT);テーブル
tbl7にカラムストアインデックスidx1_tbl7_cgを作成し、インデックステーブル上にage列の冗長データを保存します。ALTER TABLE tbl7 ADD INDEX idx1_tbl7_cg(id) STORING(age) WITH COLUMN GROUP(each column);
マルチバリューインデックスの作成
OceanBaseデータベースでは、テーブル作成時(CREATE TABLE)にマルチバリューインデックスを事前に作成できます。現在、テーブル作成後にマルチバリューインデックスを追加することはサポートされていませんが、ALTER TABLE ステートメントを使用して既存のインデックスを削除することは可能です。マルチバリューインデックスを含む主テーブルが作成されている場合、複雑なDML操作がサポートされています。
マルチバリューインデックスの使用制限
各マルチバリューインデックスには、マルチバリューキー部分が1つしか許可されません。ただし、
CAST(... AS ... ARRAY)式を使用すると、次のようにJSONドキュメント内の複数の配列を参照できます。CAST(data->'$.arr[*][*]' AS UNSIGNED ARRAY)この場合、JSON式に一致するすべての値は、単一の平面配列としてインデックスに格納されます。
マルチバリューインデックスはカバリングインデックスにすることはできません。
マルチバリューキー部分で許可される唯一の式のタイプはJSON式です。式はインデックス列に挿入されたJSONドキュメント内の既存の要素を参照する必要はありませんが、構文上有効である必要があります。
同じクラスタインデックスレコードのインデックスレコードがマルチバリューインデックス内に分散しているため、マルチバリューインデックスは範囲スキャンやインデックスのみのスキャンをサポートしていません。
マルチバリューインデックスは外部キースペシフィケーションでの使用を許可されていません。
マルチバリューインデックスにはインデックスプレフィックスを定義できません。
バイナリ型データにはマルチバリューインデックスを定義できません。
マルチバリューインデックスのオフラインDDLサポートについては、Offline DDLを参照してください。
V4.3.5 BP3バージョンでは、現在、カラムストアマルチバリューインデックスの作成はサポートされていません。
CREATE TABLEステートメントを使用した複数値インデックスの作成
CREATE TABLE ステートメントを使用して複数値インデックスを作成するための簡略構文は以下のとおりです:
複数値インデックスを作成します:
CREATE TABLE table_name(column_name column_definition, [column_name column_definition, ...],
json_column_name JSON,
[UNIQUE] INDEX idx_json_name((CAST(json_column_name->'$.json_field_name' AS UNSIGNED ARRAY)))
);
複合複数値インデックスを作成します:
CREATE TABLE table_name(column_name column_definition, [column_name column_definition, ...],
json_column_name JSON,
INDEX idx_json_name(column_name, [column_name, ...] (CAST(json_column_name->'$.json_field_name' AS CHAR(n) ARRAY)))
);
関連パラメータの説明は以下のとおりです:
table_name:作成するテーブルの名前を指定します。column_name:テーブルの他の(JSONを除く)データ型の列名を指定します。column_definition:テーブル内の各列に対応するデータ型を定義します。json_column_name:テーブルのJSONデータ型の列名を指定します。UNIQUE:オプションで、一意の複数値インデックスを作成することを示します。一意の複数値インデックスでは、インデックスキーは重複してはなりません。注意
複数値インデックスは一意のインデックスとして定義できます。一意のインデックスとして定義されている場合、複数値インデックスに既に存在する値を挿入しようとすると、重複キーエラーが返されます。既に重複値が存在する場合、一意の複数値インデックスを追加しようとすると失敗します。
idx_json_name: 作成する複数値インデックスのインデックス名を指定します。json_field_name:Json列でインデックスを作成するフィールド名。
テーブル作成構文の詳細については、CREATE TABLEを参照してください。
複数値インデックスを作成する例は以下のとおりです:
テーブル
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)))
);
複雑なDML操作のサポート
複数値インデックスを含む主表が作成されている場合、複雑なDML操作をサポートします。例:
INSERT INTO ON DUPLICATE KEYCREATE TABLE customers(id INT PRIMARY KEY, uid INT, j JSON); INSERT INTO customers VALUES (10, 21, '{"user":"Jack","user_id":37,"zipcode":[94582,94536]}'); CREATE INDEX zips ON customers((CAST(j->'$.zipcode' AS UNSIGNED ARRAY))); INSERT INTO customers VALUES (10, 22, '{"user":"Jack","user_id":37,"zipcode":[24582,34536]}') ON DUPLICATE KEY UPDATE j = '{"user":"Jack","user_id":37,"zipcode":[34582,44536]}';REPLACE INTOCREATE TABLE test_array(id int,a varchar(50),j json,INDEX index_1( (CAST(j->'$.key' AS UNSIGNED ARRAY))) ); INSERT INTO test_array VALUES(1,'test','{"key":[1,2,3,4]}'); REPLACE INTO test_array VALUES(1,'test','{"key":[8,9,13,43]}');複数テーブルの
UPDATEおよびDELETE例として、以下のテーブルを準備します:
CREATE TABLE table_1(a int PRIMARY KEY, b json, INDEX index_1( (CAST(b->'$.key' AS UNSIGNED ARRAY))) ); CREATE TABLE table_2(a int PRIMARY KEY, b json); INSERT INTO table_1 values(1, '{"key":[1,2,3,4]}'); INSERT INTO table_2 values(1, '{"key":[1,2,3,4]}');UPDATEの例:UPDATE table_1 JOIN table_2 ON table_1.a = table_2.a SET table_1.b = '{"key":[11,12,13,14]}', table_2.b = '{"key":[21,22,23,24]}'; UPDATE table_1 JOIN table_2 ON table_1.a = table_2.a SET table_1.b = '{"key":[31,32,33,34]}'; UPDATE table_1 JOIN table_2 ON table_1.a = table_2.a SET table_2.b = table_1.b;DELETEの例:DELETE table_1, table_2 FROM table_1 JOIN table_2 ON table_1.a = table_2.a; DELETE table_1 FROM table_1 JOIN table_2 ON table_1.a = table_2.a; DELETE table_1 FROM table_1 JOIN table_2 ON table_1.a = table_2.a;ビューの更新
CREATE TABLE test(id int,a varchar(50),j json,INDEX index_1( (CAST(j->'$.key' AS UNSIGNED ARRAY))) ); INSERT INTO test values(1,'test','{"key":[1,2,3,4]}'); CREATE VIEW vtest AS SELECT * FROM test; UPDATE vtest SET j='{"key":[1,2]}';
既存テーブルへの複数値インデックスの追加
既存テーブルに複数値インデックスを追加するには、まず構成パラメータ _enable_add_fulltext_index_to_existing_table を有効にする必要があります。
ALTER SYSTEM SET _enable_add_fulltext_index_to_existing_table = true;
既存テーブルへの複数値インデックスの追加方法は以下のとおりです:
| カテゴリ | 説明 |
|---|---|
| マルチバリューインデックス | ADD INDEX/ALTER TABLE を使用してマルチバリューインデックスを作成します |
| 複合マルチバリューインデックス | ADD INDEX/ALTER TABLE を使用して、非一意の複合マルチバリューインデックスを作成します。複合マルチバリューインデックスとは、1列のみがマルチバリューインデックスであり、他の列は通常の列であることを許可するものです |
| 一意マルチバリューインデックス | ADD INDEX/ALTER TABLE を使用して、一意マルチバリューインデックスを作成します |
| 一意複合マルチバリューインデックス | ADD INDEX/ALTER TABLE を使用して、一意複合マルチバリューインデックスを作成します。複合マルチバリューインデックスとは、1列のみがマルチバリューインデックスであり、他の列は通常の列であることを許可するものです |
例はそれぞれ以下のとおりです:
テーブル
json_tbl1を作成し、同時に(一意ではない)複数値インデックスidx1_json_tbl1も作成します。CREATE TABLE json_tbl1(id INT PRIMARY KEY, uid INT, j JSON); INSERT INTO json_tbl1 VALUES (10, 21, '{"user":"Jack","user_id":37,"zipcode":[94582,94536]}'), (11, 22, '{"user":"Jill","user_id":22,"zipcode":[94568,94507,94582]}'), (12, 23, '{"user":"Bob","user_id":31,"zipcode":[94477,94507]}'), (13, 24, '{"user":"Mary","user_id":72,"zipcode":[94536]}'), (14, 25, '{"user":"Ted","user_id":56,"zipcode":[94507,94582]}'); CREATE INDEX idx1_json_tbl1 ON json_tbl1((CAST(j->'$.zipcode' AS UNSIGNED ARRAY)));一意の複数値インデックス
idx1_json_tbl2を作成します。CREATE TABLE json_tbl2(id INT PRIMARY KEY, uid INT, j JSON); INSERT INTO json_tbl2 VALUES (10, 21, '{"user":"Jack","user_id":37,"zipcode":[94507,94536]}'), (11, 22, '{"user":"Jill","user_id":22,"zipcode":[94568,94582]}'), (12, 23, '{"user":"Bob","user_id":31,"zipcode":[94477]}'); CREATE UNIQUE INDEX idx1_json_tbl2 ON json_tbl2((CAST(j->'$.zipcode' AS UNSIGNED ARRAY)));複合複数値インデックス
idx1_json_tbl3を作成します。CREATE TABLE json_tbl3 ( id BIGINT NOT NULL PRIMARY KEY, c1 BIGINT NOT NULL, modified BIGINT NOT NULL, custinfo JSON ); INSERT INTO json_tbl3 VALUES (10, 21, 101, '{"user":"Jack","user_id":37,"zipcode":[94582,94536]}'), (11, 22, 102, '{"user":"Jill","user_id":22,"zipcode":[94568,94507,94582]}'), (12, 23, 103, '{"user":"Bob","user_id":31,"zipcode":[94477,94507]}'), (13, 24, 104, '{"user":"Mary","user_id":72,"zipcode":[94536]}'), (14, 25, 105, '{"user":"Ted","user_id":56,"zipcode":[94507,94582]}'); CREATE INDEX idx1_json_tbl3 ON json_tbl3 (c1, modified, (CAST(custinfo->'$.zipcode' AS UNSIGNED ARRAY)) );一意の複合複数値インデックス
idx1_json_tbl4を作成します。CREATE TABLE json_tbl4 ( id BIGINT NOT NULL PRIMARY KEY, c1 BIGINT NOT NULL, modified BIGINT NOT NULL, custinfo JSON ); INSERT INTO json_tbl4 VALUES (10, 21, 101, '{"user":"Jack","user_id":37,"zipcode":[94582,94536]}'), (11, 22, 102, '{"user":"Jill","user_id":22,"zipcode":[94568,94507,94582]}'), (12, 23, 103, '{"user":"Bob","user_id":31,"zipcode":[94477,94507]}'), (13, 24, 104, '{"user":"Mary","user_id":72,"zipcode":[94536]}'), (14, 25, 105, '{"user":"Ted","user_id":56,"zipcode":[94507,94582]}'); CREATE UNIQUE INDEX idx1_json_tbl4 ON json_tbl4 (c1, modified, (CAST(custinfo->'$.zipcode' AS UNSIGNED ARRAY)) );
クエリでのマルチバリューインデックスの使用
オプティマイザーは、WHERE 句で以下の関数が指定されている場合、マルチバリューインデックスを使用してクエリを実行します。
例:
MEMBER OF()を使用したクエリの例。SELECT * FROM json_tbl1 WHERE 94507 MEMBER OF(col3->'$.ipcode');実行結果は次のとおりです:
+------+------+-------------------------------------------------------------------+ | col1 | col2 | col3 | +------+------+-------------------------------------------------------------------+ | 2 | a2 | {"user": "Jk002", "ipcode": [94568, 94507, 94582], "user_id": 22} | | 3 | a3 | {"user": "Jk003", "ipcode": [94477, 94507], "user_id": 31} | | 5 | a5 | {"user": "Jk005", "ipcode": [94507, 94582], "user_id": 56} | +------+------+-------------------------------------------------------------------+ 3 rows in setテーブル
json_tbl1に対してクエリを実行し、列col3のJSONデータ内のフィールドipcodeに値 94507 を含む行をフィルタリングします。EXPLAINコマンドを使用してクエリの実行計画を確認します。EXPLAIN SELECT * FROM json_tbl1 WHERE 94507 MEMBER OF(col3->'$.ipcode');実行結果は次のとおりです:
+-------------------------------------------------------------------------------------------------------------------------------------------------------+ | Query Plan | +-------------------------------------------------------------------------------------------------------------------------------------------------------+ | ===================================================================== | | |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| | | --------------------------------------------------------------------- | | |0 |TABLE RANGE SCAN|json_tbl1(idx1_json_tbl1)|3 |13 | | | ===================================================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([json_tbl1.col1], [json_tbl1.col2], [json_tbl1.col3]), filter(nil) | | access([json_tbl1.__pk_increment], [json_tbl1.col3], [json_tbl1.col1], [json_tbl1.col2]), partitions(p0) | | is_index_back=true, is_global_index=false, | | range_key([json_tbl1.SYS_NC_mvi_19], [json_tbl1.__pk_increment], [json_tbl1.__doc_id_1715756608129539]), range(94507,MIN,MIN ; 94507,MAX,MAX), | | range_cond([JSON_MEMBER_OF(94507, json_tbl1.SYS_NC_mvi_19)]) | +-------------------------------------------------------------------------------------------------------------------------------------------------------+ 12 rows in setJSON_CONTAINS()を使用したクエリの例。SELECT * FROM json_tbl1 WHERE JSON_CONTAINS(col3->'$.ipcode', CAST('[94507,94582]' AS JSON));実行結果は次のとおりです:
+------+------+-------------------------------------------------------------------+ | col1 | col2 | col3 | +------+------+-------------------------------------------------------------------+ | 2 | a2 | {"user": "Jk002", "ipcode": [94568, 94507, 94582], "user_id": 22} | | 5 | a5 | {"user": "Jk005", "ipcode": [94507, 94582], "user_id": 56} | +------+------+-------------------------------------------------------------------+ 2 rows in setJSON_OVERLAPS()を使用したクエリの例。SELECT * FROM json_tbl1 WHERE JSON_OVERLAPS(col3->'$.ipcode', CAST('[94507,94582]' AS JSON));実行結果は次のとおりです:
+------+------+-------------------------------------------------------------------+ | col1 | col2 | col3 | +------+------+-------------------------------------------------------------------+ | 1 | a1 | {"user": "Jk001", "ipcode": [94582, 94536], "user_id": 37} | | 2 | a2 | {"user": "Jk002", "ipcode": [94568, 94507, 94582], "user_id": 22} | | 3 | a3 | {"user": "Jk003", "ipcode": [94477, 94507], "user_id": 31} | | 5 | a5 | {"user": "Jk005", "ipcode": [94507, 94582], "user_id": 56} | +------+------+-------------------------------------------------------------------+ 4 rows in set
フルテキストインデックスの作成
OceanBaseデータベースのMySQLモードでは、現在のバージョンではCREATE TABLEステートメント、CREATE FULLTEXT INDEXステートメント、またはALTER TABLEステートメントを使用してフルテキストインデックスを作成できます。
フルテキストインデックスの詳細については、フルテキストインデックスを参照してください。
フルテキストインデックスを使用したデータのクエリに関する情報については、フルテキストクエリを参照してください。
フルテキストインデックスの使用制限および注意事項
パーティションテーブルとパーティションテーブルに主キーがあるかどうかに関わらず、フルテキストインデックスを作成できます。フルテキストインデックスの作成には以下の制限があります:
- フルテキストインデックスは、
CHAR、VARCHAR、およびTEXTタイプの列にのみ適用できます。 - 現在のバージョンでは、ローカル(
LOCAL)フルテキストインデックスのみの作成がサポートされています。 - フルテキストインデックスを作成する際には、
UNIQUEキーワードを指定することはできません。 - 複数の列にまたがるフルテキストインデックスを作成する場合、これらの列が同一の文字セットを持っている必要があります。
- フルテキストインデックスによるオフラインDDLのサポート状況については、Offline DDLを参照してください。
- V4.3.5 BP3バージョンでは、現時点ではカラムストア型のフルテキストインデックスの作成はサポートされていません。
CREATE TABLEステートメントを使用した全文インデックスの作成
CREATE TABLE ステートメントを使用して、テーブル作成時に同時に全文インデックスを作成できます。簡略化された構文は以下のとおりです:
CREATE TABLE table_name(column_name column_definition,[column_name column_definition,...]
FULLTEXT [INDEX | KEY] [index_name](column_name)
[WITH PARSER tokenizer_option]
[PARSER_PROPERTIES[=](parser_properties_list)]
[LOCAL]);
tokenizer_option:
SPACE
| NGRAM
| BENG
| IK
| NGRAM2
parser_properties_list:
parser_properties, [parser_properties]
parser_properties:
min_token_size = int_value
| max_token_size = int_value
| ngram_token_size = int_value
| ik_mode = 'char_value'
| min_ngram_size = int_value
| max_ngram_size = int_value
CREATE TABLE の詳細な構文については、CREATE TABLEを参照してください。
関連パラメータの説明は以下のとおりです:
table_name:作成するテーブルの名前を指定します。column_name:テーブルの列を指定します。column_definition:テーブル内の各列に対応するデータ型を定義します。FULLTEXT:全文インデックスの作成を指定します。注意
現在のバージョンでは、ローカル全文インデックスのみの作成がサポートされています。
INDEX | KEY:このステートメントにおいて、インデックスキーワードとしてINDEXまたはKEYを使用できることを示します。index_name:オプションで、作成するインデックスの名前を指定します。指定しない場合、デフォルトのインデックス名は指定された列名と同じになります。WITH PARSER tokenizer_option:オプションで、全文インデックスのトークナイザーを指定します。値は以下のとおりです:SPACE:デフォルト値で、スペースに基づいてトークン化することを示します。以下のプロパティを指定できます:プロパティ 値の範囲 min_token_size [1, 16] max_token_size [10, 84] NGRAM:N-Gram(中国語)に基づくトークン化方式を示します。以下のプロパティを指定できます:プロパティ 値の範囲 ngram_token_size [1, 10] NGRAM2:テキストをmin_ngram_size~max_ngram_sizeの範囲の連続文字に分割することを示します。プロパティ 値の範囲 min_ngram_size [1, 16] max_ngram_size [1, 16] 説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP2以降のバージョンから
NGRAM2トークナイザーがサポートされています。BENG:Beng(基本的な英語)に基づくトークン化方式を示します。以下のプロパティを指定できます:プロパティ 値の範囲 min_token_size [1, 16] max_token_size [10, 84] IK:IK(中国語)に基づくトークン化方式を示します。現在はutf-8文字セットのみサポートされています。以下のプロパティを指定できます:プロパティ 値の範囲 ik_mode smartmax_word
説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP1以降のバージョンから
IKトークナイザーがサポートされています。
TOKENIZE関数を使用して、指定されたトークナイザーとJSON形式のパラメータに基づくテキストのトークン化結果を確認できます。
PARSER_PROPERTIES[=](parser_properties_list):オプションで、トークナイザーのプロパティを指定します。値は以下のとおりです:min_token_size:最小トークン長を示し、デフォルト値は3で、値の範囲は1から16です。max_token_size:最大トークン長を示し、デフォルト値は84で、値の範囲は10から84です。ngram_token_size:NGRAMのトークン長を示し、NGRAMトークナイザーでのみ有効です。デフォルト値は2で、値の範囲は1から10です。ik_mode:IKトークナイザーのトークン化モードを示します。値は以下のとおりです:smart:デフォルト値で、辞書内の単語がトークン化の正確性を向上させるために使用され、辞書内の単語境界が優先的に考慮されるため、不必要な拡張が減少する可能性があります。max_word:辞書で定義された単語が認識されることを示しますが、トークン化の最大限の拡張には影響しません。辞書に定義があっても、max_wordモードは依然としてテキストをより多くの単語に分割しようとします。
説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP1以降のバージョンからトークナイザーのプロパティ(
PARSER_PROPERTIES)の指定がサポートされています。LOCAL:オプションで、ローカルインデックスの作成を指定します。
例:
テーブル
tbl1を作成し、同時に全文インデックスfull_idx1_tbl1を作成します。CREATE TABLE tbl1(id INT, name VARCHAR(18), date DATE, PRIMARY KEY (id), FULLTEXT INDEX full_idx1_tbl1(name));テーブル
tbl2を作成し、同時に全文インデックスfull_idx1_tbl2を作成します。全文インデックスのトークナイザーをNGRAMと指定し、PARSER_PROPERTIESを使用してトークナイザーのプロパティを設定します。CREATE TABLE tbl2(id INT, name VARCHAR(18), doc TEXT, FULLTEXT INDEX full_idx1_tbl2(name, doc) WITH PARSER NGRAM PARSER_PROPERTIES=(ngram_token_size=3));
CREATE FULLTEXT INDEXステートメントを使用して全文インデックスを作成する
CREATE FULLTEXT INDEX ステートメントを使用して、既存のテーブルに全文インデックスを作成します。構文は以下のとおりです:
CREATE FULLTEXT INDEX index_name ON table_name (column_name, [column_name ...])
[WITH PARSER tokenizer_option]
[PARSER_PROPERTIES[=](parser_properties_list)]
[LOCAL];
tokenizer_option:
SPACE
| NGRAM
| BENG
| IK
| NGRAM2
parser_properties_list:
parser_properties, [parser_properties]
parser_properties:
min_token_size = int_value
| max_token_size = int_value
| ngram_token_size = int_value
| ik_mode = 'char_value'
| min_ngram_size = int_value
| max_ngram_size = int_value
CREATE INDEX の構文の詳細については、CREATE INDEXを参照してください。
関連パラメータの説明は以下のとおりです:
index_name:追加するインデックスのインデックス名を指定します。table_name: インデックスを作成するテーブルの名前を指定します。column_name: どの列にインデックスを付けるかを指定します。複数の列を指定する場合は、各列を英字のカンマで区切ります。WITH PARSER tokenizer_option:オプション。全文インデックスのトークナイザーを指定します。値は以下のとおりです:SPACE:デフォルト値。スペースに基づいてトークン化することを示します。以下のプロパティを指定できます:プロパティ 値の範囲 min_token_size [1, 16] max_token_size [10, 84] NGRAM:N-Gram(中国語)に基づくトークン化方式を示します。以下のプロパティを指定できます:プロパティ 値の範囲 ngram_token_size [1, 10] NGRAM2:テキストをmin_ngram_size~max_ngram_sizeの範囲の連続した文字に分割することを示します。以下のプロパティを指定できます:プロパティ 値の範囲 min_ngram_size [1, 16] max_ngram_size [1, 16] 説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP2バージョンから
NGRAM2トークナイザーがサポートされています。BENG:Beng(基本的な英語)に基づくトークン化方式を示します。以下のプロパティを指定できます:プロパティ 値の範囲 min_token_size [1, 16] max_token_size [10, 84] IK:IK(中国語)に基づくトークン化方式を示します。現在はutf-8文字セットのみサポートしています。以下のプロパティを指定できます:プロパティ 値の範囲 ik_mode smartmax_word
説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP1バージョンから
IKトークナイザーがサポートされています。
TOKENIZE 関数を使用して、指定されたトークナイザーとJSON形式のパラメータに基づくテキストのトークン化結果を確認できます。
PARSER_PROPERTIES[=](parser_properties_list):オプション。トークナイザーのプロパティを指定します。値は以下のとおりです:min_token_size:最小トークン長を示します。デフォルト値は3で、値の範囲は1から16です。max_token_size:最大トークン長を示します。デフォルト値は84で、値の範囲は10から84です。ngram_token_size:NGRAMのトークン長を示します。NGRAMトークナイザーにのみ有効で、デフォルト値は2で、値の範囲は1から10です。ik_mode:IKトークナイザーのトークン化モードを示します。値は以下のとおりです:smart:デフォルト値。辞書内の単語がトークン化の正確性を向上させるために使用され、辞書内の単語境界が優先的に考慮されるため、不必要な拡張が減少する可能性があります。max_word:辞書で定義された単語が認識されますが、トークン化の最大拡張には影響しません。辞書に定義があっても、max_wordモードはテキストをより多くの単語に分割しようとします。
説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP1バージョンからトークナイザーのプロパティ(
PARSER_PROPERTIES)の指定がサポートされています。LOCAL:オプション。ローカルインデックスを作成することを指定します。
例:
tbl3 テーブルを作成した後、全文インデックス ft_idx1_tbl3 を作成します。
テーブル
tbl3を作成します。CREATE TABLE tbl3(col1 INT, col2 VARCHAR(4096));テーブル
tbl3に全文インデックスft_idx1_tbl3を作成し、全文インデックスのトークナイザーをIKと指定します。同時にPARSER_PROPERTIESを使用してトークナイザーのプロパティを設定します。CREATE FULLTEXT INDEX ft_idx1_tbl3 ON tbl3(col2) WITH PARSER IK PARSER_PROPERTIES=(ik_mode='max_word');
ALTER TABLEステートメントを使用して全文インデックスを作成する
ALTER TABLE ステートメントを使用して、既存のテーブルに全文インデックスを追加します。構文は以下のとおりです:
ALTER TABLE table_name ADD FULLTEXT [INDEX | KEY] [index_name](column_name, [column_name ...])
[WITH PARSER tokenizer_option]
[PARSER_PROPERTIES[=](parser_properties_list)]
[LOCAL];
tokenizer_option:
SPACE
| NGRAM
| BENG
| IK
| NGRAM2
parser_properties_list:
parser_properties, [parser_properties]
parser_properties:
min_token_size = int_value
| max_token_size = int_value
| ngram_token_size = int_value
| ik_mode = 'char_value'
| min_ngram_size = int_value
| max_ngram_size = int_value
ALTER TABLE ステートメントを使用して既存のテーブルに全文インデックスを追加する構文の詳細については、ALTER TABLEを参照してください。
関連パラメータの説明は以下のとおりです:
table_name: インデックスを作成するテーブルの名前を指定します。INDEX | KEY: オプション。このステートメントでは、インデックスキーワードとしてINDEXまたはKEYを使用できます。デフォルト値はKEYです。index_name: オプション。作成するインデックスの名前を指定します。指定されない場合、デフォルトのインデックス名は指定された列名と同じになります。column_name: インデックスを付ける列を指定します。複数の列を指定する場合は、各列を英語のカンマで区切ります。WITH PARSER tokenizer_option: オプション。全文インデックスのトークナイザーを指定します。値は以下のとおりです:SPACE: デフォルト値。スペースに基づいてトークン化を行うことを示します。以下のプロパティを指定できます:プロパティ 値の範囲 min_token_size [1, 16] max_token_size [10, 84] NGRAM: N-Gram (中国語) に基づくトークン化方式を示します。以下のプロパティを指定できます:プロパティ 値の範囲 ngram_token_size [1, 10] NGRAM2: テキストをmin_ngram_size~max_ngram_sizeの範囲の連続した文字に分割することを示します。以下のプロパティを指定できます:プロパティ 値の範囲 min_ngram_size [1, 16] max_ngram_size [1, 16] 説明
OceanBaseデータベースV4.3.5バージョンでは、V4.3.5 BP2バージョンから
NGRAM2トークナイザーがサポートされています。BENG: Beng (基本英語) に基づくトークン化方式を示します。以下のプロパティを指定できます:プロパティ 値の範囲 min_token_size [1, 16] max_token_size [10, 84] IK: IK (中国語) に基づくトークン化方式を示します。現在はutf-8文字セットのみサポートしています。以下のプロパティを指定できます:プロパティ 値の範囲 ik_mode smartmax_word
説明
OceanBaseデータベースV4.3.5バージョンでは、V4.3.5 BP1バージョンから
IKトークナイザーがサポートされています。
TOKENIZE関数を使用して、指定されたトークナイザーとJSON形式のパラメータに基づくテキストのトークン化結果を確認できます。
PARSER_PROPERTIES[=](parser_properties_list): オプション。トークナイザーのプロパティを指定します。値は以下のとおりです:min_token_size: 最小トークン長を示します。デフォルト値は3で、値の範囲は1から16です。max_token_size: 最大トークン長を示します。デフォルト値は84で、値の範囲は10から84です。ngram_token_size:NGRAMのトークン長を示します。NGRAMトークナイザーにのみ有効で、デフォルト値は2で、値の範囲は1から10です。ik_mode:IKトークナイザーのトークン化モードを示します。値は以下のとおりです:smart: デフォルト値。辞書内の単語がトークン化の正確性を向上させるために使用され、辞書内の単語境界が優先的に考慮されるため、不必要な拡張が減少する可能性があります。max_word: 辞書で定義された単語が認識されますが、トークン化の最大拡張には影響しません。辞書に定義があっても、max_wordモードは依然としてテキストをより多くの単語に分割しようとします。
説明
OceanBaseデータベースV4.3.5バージョンでは、V4.3.5 BP1バージョンからトークナイザーのプロパティ(
PARSER_PROPERTIES)の指定がサポートされています。LOCAL: オプション。ローカルインデックスを作成することを指定します。
例:
テーブル tbl4 を作成した後、全文インデックス ft_idx1_tbl4 を追加します。
テーブル
tbl4を作成します。CREATE TABLE tbl4(col1 INT, col2 TEXT);テーブル
tbl4に全文インデックスft_idx1_tbl4を追加し、全文インデックスのトークナイザーをBENGと指定します。同時に、PARSER_PROPERTIESを使用してトークナイザーのプロパティを設定します。ALTER TABLE tbl4 ADD FULLTEXT INDEX ft_idx1_tbl4(col2) WITH PARSER BENG PARSER_PROPERTIES=(min_token_size=2, max_token_size=64);
関連ドキュメント
MySQLモードにおけるインデックス関連の詳細は、以下を参照してください: