主キーインデックス
このページでは、ClickHouseのスパース主インデックス、その構築方法、動作方法、およびクエリの高速化にどのように役立つかを紹介します。
高度なインデックス戦略やより深い技術詳細については、主インデックスの深堀りを参照してください。
ClickHouseにおけるスパース主インデックスの動作方法
ClickHouseのスパース主インデックスは、グラニュール—行のブロック—を効率的に特定し、テーブルの主キー列に対するクエリの条件に一致するデータを含む可能性のあるグラニュールを特定するのに役立ちます。次のセクションでは、これらの列の値からこのインデックスがどのように構築されるかを説明します。
スパース主インデックスの作成
スパース主インデックスがどのように構築されるかを示すために、uk_price_paid_simple テーブルを使用し、いくつかのアニメーションを加えます。
リマインダーとして、私たちの①のサンプルテーブルでは、主キー(town, street)を持ち、②挿入データは③ディスクに保存され、主キー列の値でソートされ、圧縮されて各カラムごとに別々のファイルに格納されています:

処理のために、各カラムのデータは④論理的にグラニュールに分割されます—各グラニュールは8,192行をカバーします—これはClickHouseのデータ処理メカニズムが扱う最小単位です。
このグラニュール構造こそが、主インデックスをスパースにする理由です:すべての行をインデックスするのではなく、ClickHouseは⑤各グラニュールから1行の主キー値—具体的には最初の行—のみを保存します。これにより、各グラニュールにつき1つのインデックスエントリが生成されます:

そのスパース性のおかげで、主インデックスはメモリに完全に収まるほど小さく、主キー列のプレディケートに基づくクエリの高速フィルタリングを可能にします。次のセクションでは、どのようにこのインデックスがクエリを加速させるかを示します。
主インデックスの使用
スパース主インデックスがクエリの加速にどのように使用されるかを、別のアニメーションで概説します:

① サンプルクエリには、両方の主キー列に対するプレディケートが含まれています: town = 'LONDON' AND street = 'OXFORD STREET'
。
② クエリを加速させるために、ClickHouseはテーブルの主インデックスをメモリにロードします。
③ 次に、インデックスエントリをスキャンして、どのグラニュールがプレディケートに一致する行を含む可能性があるかを特定します—言い換えれば、どのグラニュールをスキップできないかを特定します。
④ これらの潜在的に関連するグラニュールは、クエリに必要な他のカラムからの対応するグラニュールと共にメモリにロードされ、処理されます。
主インデックスの監視
テーブル内の各data partには独自の主インデックスがあります。これらのインデックスの内容は、mergeTreeIndexテーブル関数を使用して検査できます。
次のクエリは、サンプルテーブルの各データパートの主インデックスのエントリ数をリストします: