本記事では、インデックスの作成方法について説明します。
背景
OceanBaseデータベースでは、非パーティションテーブルとパーティションテーブルにインデックスを作成できます。インデックスはローカルインデックスまたはグローバルインデックス、一意インデックスまたは非一意インデックス、空間インデックスまたは関数インデックスにすることができます。パーティションテーブルの一意インデックスの場合、ローカルの一意インデックスにはテーブルパーティションのパーティションキーを含める必要があります。インデックスの詳細については、インデックスの概要 を参照してください。
このセクションでは主に、非パーティションテーブルにインデックスを作成する方法について説明します。パーティションテーブルのインデックス作成については、パーティションテーブルにインデックスを作成する を参照してください。
注意点
インデックスを作成する際には、OceanBaseデータベースではインデックス名がデータベース(DataBase)の範囲内で重複してはならない点に注意してください。
通常インデックスの作成
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));
関連パラメータの説明は以下のとおりです:
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(Minimum Bounding Rectangle)構築を格納しており、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列または複数列の値に基づいて計算された結果に基づいて作成されるインデックスを関数インデックスと呼びます。関数インデックスは最適化技術の一種であり、クエリ時に一致する関数値を迅速に特定し、重複計算を回避してクエリ効率を向上させることができます。
例えば、sale というテーブルがあり、その中に date 型の列 date_col があるとします:
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ドキュメント内の既存の要素を参照する必要はありませんが、構文的に有効である必要があります。
同一のクラスタインデックスレコードのインデックスレコードが複数値インデックス内に分散しているため、複数値インデックスは範囲スキャンやインデックスのみのスキャンをサポートしません。
複数値インデックスは外部キースペシフィケーションでの使用を許可していません。
複数値インデックスにインデックスプレフィックスを定義することはできません。
Binary型のデータには複数値インデックスを定義できません。
複数値インデックスのOffline DDLに対するサポート状況については、Offline DDLを参照してください。
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を参照してください。
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] BENG:Beng(基本英語)に基づく分かち方を示します。以下のプロパティを指定できます:プロパティ値の範囲min_token_size [1, 16] max_token_size [10, 84] IK:IK(中国語)に基づく分かち方を示します。現在はutf-8文字セットのみをサポートしています。以下のプロパティを指定できます:プロパティ値の範囲ik_mode smartmax_word
テキストを指定されたトークナイザーおよびJSON形式のパラメータで分割した結果を確認するには、TOKENIZE 関数を使用できます。
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モードはテキストをより多くの単語に分割しようと試みます。
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] BENG:Beng(英語ベース)に基づく単語分割方式を表します。以下のプロパティを指定できます:プロパティ値の範囲min_token_size [1, 16] max_token_size [10, 84] IK:IK(中国語)に基づく単語分割方式を表します。現在はutf-8文字セットのみサポートしています。以下のプロパティを指定できます:プロパティ値の範囲ik_mode smartmax_word
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モードはテキストをより多くの単語に分割しようと試みます。
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] BENG:Beng(基本英語)に基づく分かち書き方法を示します。以下のプロパティを指定できます:プロパティ値の範囲min_token_size [1, 16] max_token_size [10, 84] IK:IK(中国語)に基づく分かち書き方法を示します。現在はutf-8文字セットのみをサポートしています。以下のプロパティを指定できます:プロパティ値の範囲ik_mode smartmax_word
テキストが指定されたトークナイザーおよびJSON形式のパラメータに従ってどのように分かち書きされるかの結果を確認するには、TOKENIZE 関数を使用できます。
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モードはテキストをより多くの単語に分割しようと試みます。
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モードにおけるインデックスの詳細については、以下を参照してください: