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