インデックスはセカンダリインデックスとも呼ばれ、オプションな構造であり、ユーザーは自身のビジネスニーズに応じて特定のフィールドにインデックスを作成することで、これらのフィールドに対するクエリ速度を向上させることができます。この章では、インデックスの利点と欠点、インデックスの可用性と可視性、およびインデックスとキーの関係について説明します。
OceanBaseデータベースは集約インデックステーブルモデルを採用しており、ユーザーが指定した主キーには自動的に主キーインデックスが生成されます。一方、ユーザーが作成する他のインデックスはセカンダリインデックスとなります。
以下の例のように、テーブル EMPLOYEE を作成し、3組のデータを挿入します。
obclient> CREATE TABLE EMPLOYEE(id INT, name VARCHAR(20), PRIMARY KEY(id));
obclient> INSERT INTO EMPLOYEE VALUES(1,'John'),(2,'Alice'),(3,'Bob');
obclient> SELECT * FROM EMPLOYEE;
EMPLOYEE テーブルでは、ユーザーが指定した id に従ってデータが順序付けられて保存されます。データ検索時には、id に基づいて二分探索方式で迅速に特定のデータを特定できます。name フィールドに基づいて迅速に検索する必要がある場合は、次の例のように name フィールドにセカンダリインデックスを作成できます。
CREATE INDEX IDX_NAME ON EMPLOYEE(name);
インデックステーブル内のデータは次のとおりです:
name: Alice, id: 2
name: Bob, id :3
name: John, id: 1
インデックステーブル name_index では、name フィールドに従ってデータが順序付けられて保存されます。ユーザーが name フィールドに基づくクエリを指定すると、二分探索方式で迅速に特定のデータを特定できます。
インデックスの利点と欠点
インデックスの利点は以下のとおりです:
SQL文を変更することなく、ユーザーが必要とするデータの一部のみをスキャンすることで、クエリを高速化できます。
インデックスに格納される列数は通常少ないため、クエリI/Oを節約できます。
インデックスの欠点は以下のとおりです:
どのフィールドにインデックスを作成するかを選択するには、ビジネスとデータモデルについて深い理解が必要です。
ビジネスが変更された場合、以前に作成したインデックスが依然として要件を満たしているかどうかを再評価する必要があります。
データの書き込み時には、インデックステーブル内のデータを維持するため、一定のパフォーマンスコストが発生します。
インデックステーブルはメモリやディスクなどのリソースを消費します。
インデックスの可用性と可視性
インデックスの可用性
- Truncateパーティション/パーティションの削除は、デフォルトでインデックスを無効にし、その後
DROP INDEX/CREATE INDEX操作で手動でインデックスを再構築できます。 DROP/TRUNCATEパーティションステートメントの後にUPDATE GLOBAL INDEXES句を追加すると、MySQLモードと同様にインデックスが自動的に再構築されます。UPDATE GLOBAL INDEXESキーワードを追加しない場合、パーティションを削除すると、そのパーティションテーブル上のグローバルインデックスは利用不可状態になります。
インデックスの可視性
インデックスの可視性とは、オプティマイザーがそのインデックスを無視するかどうかを指します。インデックスが可視でない場合、オプティマイザーはそのインデックスを無視しますが、DML操作ではインデックスを維持する必要があります。一般的に、インデックスを削除する前に、まずインデックスを非可視に設定して業務への影響を観察し、影響がないことを確認した後にインデックスを削除します。
インデックスとキーの関係
キーとは、一連の列または式を指し、ユーザーはキーにインデックスを作成できます。しかし、インデックスとキーは異なります。インデックスはデータ内に格納されるオブジェクトであり、キーは論理的な概念です。
関数ベースのインデックス
テーブル内の1列または複数の列の値に基づいて計算された結果に基づいて作成されるインデックスを関数ベースのインデックスと呼びます。関数ベースのインデックスは最適化技術の一種であり、関数ベースのインデックスを使用することで、クエリ時に一致する関数値を迅速に特定でき、重複計算を回避し、クエリ効率を向上させることができます。
カラムストアインデックス
カラムストアインデックスとは、インデックステーブル内のデータをカラムストア形式で保存するものです。OceanBaseデータベースはV4.3.0バージョンから、テーブル作成時にテーブルのストレージ形式をカラムストアとして指定できるようになりました。インデックスもデータテーブルと同様にテーブルであるため、インデックステーブル内のデータもカラムストア形式で保存することが可能です。
カラムストアの詳細については、カラムストアを参照してください。