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