- minmax: ブロックごとに式の最小値と最大値を追跡します。緩やかにソートされたデータに対する範囲クエリに最適です。
- set(N): 各ブロックについて、指定したサイズ N までの値の集合を追跡します。ブロックごとのカーディナリティが低いカラムで効果的です。
- text: トークン化された文字列データに対して転置索引を構築し、高効率かつ決定論的な全文検索を可能にします。近似的な Bloom filter ベースの方式ではなく、正確なトークン検索とスケーラブルな複数語検索が求められる自然言語テキストや大きな自由形式テキストのカラムに推奨されます。
- bloom_filter: 値がブロック内に存在するかどうかを確率的に判定し、集合への包含に対する高速な近似フィルタリングを可能にします。多数の中からまれな値を見つける、いわゆる “needle in a haystack” のようなクエリの最適化に効果的です。
- tokenbf_v1 / ngrambf_v1: (非推奨) 文字列内のトークンや文字シーケンスを検索するために設計された特殊な Bloom filter の派生で、特にログデータやテキスト検索のユースケースで有用です。ClickHouse バージョン >= 26.2 では、テキスト索引の導入により非推奨となりました。
- 全体としては高カーディナリティだが、ブロック内では低カーディナリティのカラム。
- 検索上重要なまれな値 (例: エラーコード、特定の ID) 。
- 非主キーカラムに対するフィルタリングが局所的な分布で発生するケース。
- 実データと現実的なクエリでスキップ索引をテストしてください。異なる索引タイプやグラニュラリティ値を試してください。
- 索引の有効性を確認するため、send_logs_level=‘trace’ や
EXPLAIN indexes=1などを使って影響を評価してください。 - 必ず索引サイズと、それがグラニュラリティによってどのように影響を受けるかを評価してください。グラニュラリティサイズを小さくすると、多くの場合、より多くのグラニュールをフィルタできるようになり、スキャン量が減るため、ある程度まではパフォーマンスが向上します。ただし、グラニュラリティを小さくするほど索引サイズは大きくなるため、パフォーマンスが低下する場合もあります。さまざまなグラニュラリティのデータポイントで、パフォーマンスと索引サイズを測定してください。これは Bloom filter 索引では特に重要です。
例
EXPLAIN indexes = 1 が示すとおり、大部分の行は依然として読み取る必要があります。
ViewCount は CreationDate (主キー) と相関付けられることがわかります。投稿が存在する期間が長いほど、閲覧される機会も多くなるためです。
ALTER TABLE コマンドで追加します。最初に追加し、その後「マテリアライズ」します。
ViewCount の最小値と最大値を追跡しています。
先ほどのクエリを再度実行すると、パフォーマンスが大幅に改善されていることがわかります。スキャンされた行数が減っている点に注目してください。
EXPLAIN indexes = 1 を実行すると、索引が使用されていることを確認できます。
ViewCount > 10,000,000 という述語に一致し得ないすべての行ブロックを、minmaxスキップ索引がどのように除外するかを示すアニメーションも掲載しています。