本記事では、OceanBase データベースのMySQLモードにおける基本的なインデックス操作について説明します。これには、インデックスの作成、表示、追加、削除、名前変更が含まれます。
インデックスの作成
インデックスを作成するには、以下の2つの方法があります:
CREATE INDEX
CREATE [SPATIAL | UNIQUE] INDEX [IF NOT EXISTS] index_name [USING BTREE] ON table_name (sort_column_key [, sort_column_key... ]) [index_option...] [partition_option];関連パラメータの説明は以下のとおりです:
index_name:作成するインデックスの名前を指定します。table_name:インデックスを作成するテーブルの名前を指定します。sort_column_key:ソート列のキーを指定します。インデックス作成時に複数のソート列を指定でき、複数のソート列は半角カンマ(,)で区切ります。index_option:インデックスオプションを指定します。インデックス作成時に複数のインデックスオプションを指定でき、複数のインデックスオプションは半角スペースで区切ります。partition_option:インデックスのパーティションを作成するオプションを指定します。
詳細な構文については、CREATE INDEXを参照してください。
特定のテーブルのインデックスを作成しても、そのテーブルは読み書きや書き込み操作に引き続き使用できます。インデックス作成の例を以下に示します。
データベースにテーブルt1が既に存在すると仮定します。t1テーブルにindex1という名前のインデックスを作成し、このインデックスがc1列に基づいて昇順でソートされるよう指定します。
obclient> CREATE INDEX index1 ON t1 (c1 ASC);データベースにテーブルt2が既に存在すると仮定します。t2テーブルにindex2という名前のインデックスを作成し、インデックス式としてc1+c2を指定します。
obclient> CREATE INDEX IF NOT EXISTS index2 ON t2 (c1 + c2);
CREATE TABLE
CREATE TABLE [IF NOT EXISTS] table_name (column_name column_definition,[column_name column_definition,...], {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option...]);関連パラメータの説明は以下のとおりです:
table_name:作成するテーブルの名前を指定します。column_name:テーブルの列を指定します。column_definition:テーブルの各列に対応するデータ型を定義します。INDEX | KEY:このステートメントでは、インデックスキーワードとしてINDEXまたはKEYのどちらを使用してもかまいません。index_name:オプションです。作成するインデックスの名前を指定します。指定しない場合、デフォルトでインデックス名は指定された列名と同じになります。index_type:オプションです。インデックスタイプを指定します。key_part:(関数)インデックスを作成します。index_option:インデックスオプションを指定します。複数のindex_optionを指定する場合は、半角スペースで区切ります。
詳細な構文については、CREATE TABLEを参照してください。
ここでは、データベース内に
t3テーブルを作成すると同時にインデックスindex3を作成し、index3がid列に基づいて昇順に並ぶよう指定する例を示します。実行コマンドは以下のとおりです:obclient> CREATE TABLE t3 (id int, name varchar(50), INDEX index3 (id ASC));
インデックスの確認
SHOW INDEX ステートメントを実行して、テーブルのインデックスを確認できます。テーブル test のインデックスの例を以下に示します:
obclient> SHOW INDEX FROM test;
出力は次のとおりです:
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
| test | 0 | PRIMARY | 1 | id | A | NULL | NULL | NULL | | BTREE | available | | YES | NULL |
| test | 1 | index1 | 1 | name | A | NULL | NULL | NULL | | BTREE | available | | YES | NULL |
| test | 1 | index2 | 1 | age | A | NULL | NULL | NULL | | BTREE | available | | YES | NULL |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
クエリ結果に含まれる関連フィールドの説明は以下のとおりです:
Non_unique:インデックスに重複値を含めることができない場合は0、可能な場合は1です。これは一般的に一意インデックスと呼ばれています。Key_name:インデックス名。Seq_in_index:インデックス内の列のシーケンス番号で、1または2です。これは、複合インデックス内でのインデックスの順序を示すために使用されます。Column_name:インデックスの列名。Collation:列がインデックス内でどのように格納されるかを示します。Cardinality:基数を意味し、インデックス内の一意の値の数の推定値を示します。Sub_part:プレフィックスインデックスでは、列がインデックスに部分的に含まれる場合、インデックスに含まれる文字数を示します。列全体がインデックスに含まれる場合はNULLです。Packed:キーワードが圧縮されている方法を示します。圧縮されていない場合はNULLです。Index_type:インデックスタイプを示します。現在はBTREEタイプのみサポートされています。Comment:このインデックスが利用可能かどうかを示します。Index_comment:このインデックスのコメント情報です。Visible:このインデックスが表示されるかどうかを示します。
インデックスの追加
インデックスを追加する構文は以下のとおりです:
ALTER TABLE table_name ADD {INDEX | KEY} index_name [index_type] (key_part,...) [index_option];
関連パラメータの説明は以下のとおりです:
table_name:インデックスを追加する対象のテーブル名を指定します。INDEX | KEY:このステートメントでは、インデックスキーワードにINDEXまたはKEYを使用できることを示します。index_name:作成するインデックスの名前を指定します。index_type:オプションです。インデックスのタイプを指定します。key_part:(関数)インデックスを作成します。index_option:インデックスオプションを指定します。複数のindex_optionを指定する場合は、スペースで区切ります。
詳細な構文については、ALTER TABLEを参照してください。
ここでは、データベースに既にテーブル t1 が存在することを前提とし、テーブル t1 に index2 という名前のインデックスを追加し、そのインデックスが c2 列と c3 列に基づいて昇順でソートされるよう指定する実行例を以下に示します:
obclient> ALTER TABLE t1 ADD INDEX index2 (c2,c3 ASC);
インデックスの削除
インデックスを削除する構文は以下の2種類です:
DROP INDEX
DROP INDEX index_name ON table_name;ここで、
index_nameは削除するインデックスの名前を指定し、table_nameはインデックスを削除する対象のテーブル名を指定します。詳細な構文については、DROP INDEXを参照してください。ALTER TABLE
ALTER TABLE table_name DROP {INDEX | KEY} index_name;関連パラメータの説明は以下のとおりです:
table_name:インデックスを削除する対象のテーブル名を指定します。INDEX | KEY:このステートメントでは、インデックスキーワードにINDEXまたはKEYを使用できることを示します。index_name:削除するインデックスの名前を指定します。
詳細な構文については、ALTER TABLEを参照してください。
特定のテーブルのインデックスを削除しても、そのテーブルは読み取りおよび書き込み操作に引き続き使用できます。
ここでは、データベースに既にテーブル t1 が存在し、テーブル t1 に index1 インデックスが存在することを前提とし、インデックスを削除する例を以下に示します:
DROP INDEX
obclient> DROP INDEX index1 ON t1;ALTER TABLE
obclient> ALTER TABLE t1 DROP INDEX index1;
インデックスの名前変更
インデックスの名前を変更する構文は以下のとおりです:
ALTER TABLE table_name RENAME {INDEX | KEY} old_index_name TO new_index_name;
関連パラメータの説明は以下のとおりです:
table_name:名前を変更するインデックスが存在するテーブル名を指定します。INDEX | KEY:このステートメントでは、インデックスキーワードにINDEXまたはKEYを使用できることを示します。old_index_name:名前を変更するインデックスの名前を指定します。new_index_name:名前変更後のインデックス名を指定します。
詳細な構文については、ALTER TABLEを参照してください。
ここでは、データベースに既にテーブル t1 が存在し、テーブル t1 に index2 という名前のインデックスが存在することを前提とし、インデックス index2 の名前を index3 に変更する実行例を以下に示します:
obclient> ALTER TABLE t1 RENAME INDEX index2 TO index3;