インデックスはオプションの構造であり、ユーザーは業務ニーズに応じて特定のフィールドにインデックスを作成することで、それらのフィールドに対するクエリの速度を向上させることができます。本記事では、インデックスの利点と欠点、およびインデックスの可用性と可視性について説明します。
インデックスの利点と欠点
インデックスの利点は以下の通りです:
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を参照してください。