本記事では、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;