ClickHouse におけるスパースプライマリインデックスの仕組み
ClickHouse のスパースプライマリインデックスは、テーブルの主キーカラムに対するクエリ条件に一致するデータを含む可能性があるグラニュール (行のブロック) を効率的に特定するのに役立ちます。次のセクションでは、このインデックスがそれらのカラムの値からどのように構築されるかを説明します。
スパースプライマリインデックスの作成
処理のため、各カラムのデータは ④ 論理的にグラニュールに分割されます。各グラニュールは 8,192 行を含み、ClickHouse のデータ処理メカニズムが扱う最小単位です。 このグラニュール構造こそが、プライマリインデックスを スパース にしている理由でもあります。ClickHouse はすべての行を索引化するのではなく、⑤ 各グラニュールにつき 1 行、具体的には先頭の行の主キー値だけを保存します。その結果、グラニュールごとに 1 つの索引エントリが作成されます。
このスパース性のおかげで、プライマリインデックスはメモリ内に完全に収まるほど小さく、主キーカラムに対する述語条件を持つクエリを高速にフィルタリングできます。次のセクションでは、これがそのようなクエリの高速化にどのように役立つかを説明します。
次のアニメーションでは、スパースプライマリインデックスがクエリの高速化にどのように使われるかを示します。
① この例のクエリには、2 つの主キーカラムの両方に対する条件が含まれています:
town = 'LONDON' AND street = 'OXFORD STREET'.
② クエリを高速化するために、ClickHouse はテーブルのプライマリインデックスをメモリに読み込みます。
③ 次に、インデックスエントリを走査して、条件に一致する行を含む可能性があるグラニュール、つまりスキップできないグラニュールを特定します。
④ その後、それらのグラニュールと、クエリに必要な他のカラムに対応するグラニュールがメモリに読み込まれ、処理 されます。
プライマリインデックスの監視
重要なポイント
- スパースプライマリインデックス は、主キーカラムに対するクエリ条件に一致する行を含む可能性があるグラニュールを特定することで、ClickHouse が不要なデータを読み飛ばせるようにします。
- 各索引には 各グラニュールの先頭行 の主キー値だけが格納されます (グラニュールはデフォルトで 8,192 行) 。そのため、メモリに収まるほどコンパクトです。
- MergeTree テーブルの 各データパート には、それぞれ 専用のプライマリインデックス があり、クエリ実行時には個別に使用されます。
- クエリ実行時、この索引により ClickHouse は グラニュールをスキップ できるため、I/O とメモリ使用量を削減しつつ、パフォーマンスを向上させます。
-
mergeTreeIndexテーブル関数を使って 索引の内容を確認 でき、EXPLAIN句で索引の利用状況を確認できます。