ビットマップインデックス
このトピックでは、ビットマップインデックスの作成と管理方法、および使用例について説明します。
ビットマップインデックスは、ビットマップ(ビットの配列)を使用する特別なデータベースインデックスです。ビットは常に 0 と 1 のいずれかの値を持ちます。ビットマップ内の各ビットは、テーブル内の単一の行に対応しています。各ビットの値は、対応する行の値に依存します。
ビットマップインデックスは、特定の列のクエリパフォーマンスを向上させるのに役立ちます。クエリがソートキー列にヒットした場合、CelerData はプレフィックスインデックスを使用して効率的にクエリ結果を返します。ただし、データブロックのプレフィックスインデックスエントリは 36 バイトを超えることはできません。ソートキーとして使用されていない列のクエリパフォーマンスを向上させたい場合は、その列に対してビットマップインデックスを作成できます。
利点
ビットマップインデックスの利点は次のとおりです。
- 列が低基数の場合、応答時間を短縮できます。例えば、ENUM 型の列などです。列内の異な る値の数が比較的多い場合は、ブルームフィルターインデックスを使用してクエリ速度を向上させることをお勧めします。詳細は Bloom filter indexing を参照してください。
- 他のインデックス技術と比較して、ストレージスペースを節約できます。ビットマップインデックスは通常、テーブル内のインデックス付きデータのサイズのほんの一部しか占めません。
- 複数のビットマップインデックスを組み合わせて、複数の列に対してクエリを実行できます。詳細は Query multiple columns を参照してください。
使用上の注意
- 等号 (
=
) または [NOT] IN 演算子を使用してフィルタリングできる列に対してビットマップインデックスを作成できます。 - 重複キーテーブルまたはユニークキーテーブルを使用するテーブルのすべての列に対してビットマップインデックスを作成できます。集計テーブルまたは主キーテーブルを使用するテーブルの場合、キー列に対してのみビットマップインデックスを作成できます。
- FLOAT、DOUBLE、BOOLEAN、および DECIMAL 型の列はビットマップインデックスの作成をサポートしていません。
- クエリがビットマップインデックスを使用しているかどうかは、クエリのプロファイルの
BitmapIndexFilterRows
フィールドを確認することで確認できます。
ビットマップインデックスの作成
列に対してビットマップインデックスを作成する方法は 2 つあります。
-
テーブルを作成する際に列に対してビットマップインデックスを作成します。例:
CREATE TABLE d0.table_hash
(
k1 TINYINT,
k2 DECIMAL(10, 2) DEFAULT "10.5",
v1 CHAR(10) REPLACE,
v2 INT SUM,
INDEX index_name (column_name [, ...]) USING BITMAP COMMENT ''
)
ENGINE = olap
AGGREGATE KEY(k1, k2)
DISTRIBUTED BY HASH(k1) BUCKETS 10
PROPERTIES ("storage_type" = "column");次の表は、ビットマップインデックスに関連するパラメータを説明しています。
Parameter Required Description index_name Yes ビットマップインデックスの名前。 column_name Yes ビットマップインデックスが作成される列の名前。これらの列名を指定することで、複数の列に対してインデックスを作成できます。 COMMENT No ビットマップインデックスのコメント。 CREATE TABLE ステートメントの他のパラメータの説明については、 CREATE TABLE を参照してください。
-
CREATE INDEX ステートメントを使 用してテーブルの列に対してビットマップインデックスを作成します。パラメータの説明と例については、 CREATE INDEX を参照してください。
CREATE INDEX index_name ON table_name (column_name) [USING BITMAP] [COMMENT ''];
ビットマップインデックスの表示
SHOW INDEX ステートメントを使用して、テーブル内に作成されたすべてのビットマップインデックスを表示できます。パラメータの説明と例については、 SHOW INDEX を参照してください。
SHOW { INDEX[ES] | KEY[S] } FROM [db_name.]table_name [FROM db_name];
Note
インデックスの作成は非同期プロセスです。したがって、作成プロセスが完了したインデックスのみを表示できます。