インデックスはオプションの構造であり、ユーザーは業務ニーズに応じて特定のフィールドにインデックスを作成することで、それらのフィールドに対するクエリの速度を向上させることができます。本記事では、インデックスの利点と欠点、およびインデックスの可用性と可視性について説明します。
インデックスの長所と短所
インデックスの長所は以下の通りです:
SQL文を変更することなく、ユーザーが必要とするデータのみをスキャンすることで、クエリを高速化できます。
インデックスに格納される列数は通常少ないため、クエリのI/Oを節約できます。
インデックスの短所は以下の通りです:
どのフィールドにインデックスを作成するかを選択するには、業務とデータモデルについて深い理解が必要です。
業務が変更された場合、以前に作成したインデックスが要件を満たしているかどうかを再評価する必要があります。
データを書き込む際には、インデックステーブル内のデータをメンテナンスする必要があり、一定のパフォーマンスコストが発生します。
インデックステーブルは、メモリやディスクなどのリソースを消費します。
インデックスの可用性と可視性
インデックスの可用性
Truncateパーティション/削除パーティション時、OceanBaseデータベースは対応するテーブルのすべてのグローバルインデックスを再構築します。再構築中は、一時的にインデックスが無効になります。
インデックスの可視性
インデックスの可視性とは、オプティマイザーがそのインデックスを無視するかどうかを指します。インデックスが不可視の場合、オプティマイザーはそのインデックスを無視しますが、DML操作ではインデックスのメンテナンスが必要です。一般的に、インデックスを削除する前に、まずインデックスを不可視に設定し、業務への影響を観察します。影響がないことを確認した後に、インデックスを削除します。
インデックスとキーの関係
キーとは、一連の列または式を指し、ユーザーはキーに基づいてインデックスを作成できます。しかし、インデックスとキーは異なります。インデックスはデータベースに格納されるオブジェクトであり、キーは論理的な概念です。
インデックスの種類
グローバルインデックスとローカルインデックス
グローバルインデックス
グローバルインデックスはテーブル全体に作成されるインデックスで、テーブルのすべてのパーティションのデータを含むことができます。グローバルインデックスは、パーティションをまたいだクエリのシナリオに適しています。
ローカルインデックス
ローカルインデックスは各パーティションに作成されるインデックスで、そのパーティションのデータのみを含みます。ローカルインデックスは、パーティション内部でのクエリのシナリオに適しています。
一意インデックスと非一意インデックス
一意インデックス
一意インデックスでは、インデックス列の値がインデックス内で一意であることが求められ、各インデックス値は1件のレコードに対応します。一意インデックスは、テーブル内の特定フィールドの一意性を保証するために使用されます。
非一意インデックス
非一意インデックスでは、インデックス列に重複する値の存在が許容されます。つまり、複数のインデックス値が1件または複数のレコードに対応することができます。非一意インデックスはインデックス列に対するクエリの高速化に使用されますが、インデックス列の一意性を保証するものではありません。
空間インデックス
空間インデックスは、空間データのクエリを高速化するための特殊なインデックスタイプで、主に地理情報システム(GIS)や空間データ処理分野で用いられます。空間インデックスは、点、線、面などの空間オブジェクトに対する効率的なクエリや空間関係分析をサポートします。
関数インデックス
テーブルの1列または複数列の値に基づいて計算された結果に基づいて作成されるインデックスを関数インデックスと呼びます。関数インデックスは最適化技術の一種で、クエリ時に関数インデックスを使用することで、一致する関数値を迅速に特定し、重複計算を回避してクエリ効率を向上させることができます。
カラムストアインデックス
カラムストアインデックスは、インデックステーブル内のデータをカラムストア形式で保存するものです。OceanBaseデータベースでは、テーブル作成時にその保存形式をカラムストアとして指定することができます。インデックスもデータテーブルと同じくテーブルであるため、インデックステーブル内のデータもカラムストア形式で保存する設定が可能です。
カラムストアの詳細については、カラムストアを参照してください。
複数値インデックス
OceanBaseデータベースのMySQLモードは複数値インデックス機能をサポートしており、これはJSONドキュメントやその他の集合データ型に特に有用です。この機能を利用することで、配列やコレクションにインデックスを作成し、JSON配列要素に基づく検索のクエリ効率を向上させることができます。
現在のバージョンでは、CREATE TABLE ステートメント内で複数値インデックスを作成できます。これには、インデックス定義内で CAST(... AS ... ARRAY) ステートメントを適用し、JSON配列内の同一タイプのスカラー値をSQL配列型に変換する操作が含まれます。この操作により、SQL配列型の値で自動的に埋め込まれる仮想列が作成されます。その後、この仮想列に関数インデックス(仮想インデックスとも呼ばれる)が作成されます。複数値インデックスは、この仮想列に基づいて構築され、この列はSQL配列から値を抽出します。
複数値インデックスの特性
複数値インデックスに影響を与えるDML操作は通常のインデックスに影響を与えるDML操作と同じ方法で処理されます。唯一の違いは、単一のクラスタインデックスレコードに対して複数回の挿入または更新が発生する可能性があることです。
NULL許容性と複数値インデックス:
- 複数値キーの一部に空の配列がある場合、インデックスにエントリは追加されず、データレコードはインデックススキャンによってアクセスできません。
- 型付け配列列がNULLに設定された場合、ストレージエンジンはNULLを含み、データレコードを指す単一のエントリを格納します。
複数値インデックスは仮想列上の仮想インデックスであるため、仮想生成列上の補助インデックスと同じルールに従う必要があります。
複数値インデックスを含むメインテーブルの作成は、複雑なDML操作をサポートしています。
複数値インデックスは後から作成することが可能です。つまり、まずメインテーブルを作成し、その後に複数値インデックスを作成することができます。
複数値インデックスの詳細については、複数値インデックスを参照してください。
フルテキストインデックス
フルテキストインデックスは、テキストデータを迅速に検索するための技術であり、テキスト内容の包括的なインデックス付けと検索を実現します。フルテキストインデックスは、ドキュメント全体または長いテキストセグメントをインデックス付けでき、その主な機能は全文検索を実現することです。つまり、ユーザーが入力したキーワードに基づいて、データベース内で一致するテキストを迅速に検索します。記事、レポート、ウェブページ、電子メールなど、大量のテキストデータを処理できます。
フルテキストインデックスの詳細については、フルテキストインデックスを参照してください。
関連ドキュメント
- 複数値/フルテキストインデックスのOffline DDLサポート状況については、Offline DDLを参照してください。