メインコンテンツへスキップ
このページでは、ClickHouse のデータスキッピングインデックスの例をまとめており、各タイプの定義方法、使用する場面、実際に適用されているかを確認する方法を紹介します。これらの機能はすべて、MergeTree ファミリーのテーブル で利用できます。 索引の構文:
ClickHouse は 6 種類のスキップ索引をサポートしています。 各セクションでは、サンプルデータを使った例を示し、クエリ実行時に索引が使用されていることを確認する方法を説明します。

MinMax索引

minmax索引は、大まかにソートされたデータや、ORDER BYと相関のあるカラムに対する範囲条件に最適です。
EXPLAIN とプルーニングを用いた実例をご覧ください。

Set 索引

ローカル (ブロック単位) のカーディナリティが低い場合は、set 索引を使用してください。各ブロックに異なる値が多数含まれる場合は、あまり効果がありません。
作成/マテリアライズのワークフローと、その前後の効果は、基本操作ガイドに示されています。 text は、トークン化されたテキストデータに対する転置索引です。 全文検索ワークロード向けに設計されており、トークンや検索語の効率的かつ決定論的なルックアップを可能にします。 自然言語検索や大規模なテキスト検索のユースケースに推奨されます。 詳細と使用例については、テキスト索引を使った全文検索をご覧ください。
より詳細なオブザーバビリティの例については、こちらのドキュメントを参照してください。 テキスト索引は完全に決定論的で、トークン化やテキスト処理を全面的に調整できますが、bloom filter ベースの索引と比べると、その分ストレージ消費は増えます。

汎用 Bloom filter (スカラー)

bloom_filter 索引は、“干し草の山から針を探す”ような等価比較や IN による存在確認に適しています。オプションのパラメータとして、偽陽性率 (デフォルトは 0.025) を指定できます。
ClickHouse バージョン >= 26.2 では、全文検索での ngrambf_v1 索引の使用は非推奨となっており、代わりに text 索引の使用が推奨されています (詳細はこちらを参照してください) 。
ngrambf_v1 索引は文字列を N-gram に分割します。LIKE '%...%' クエリに適しており、String/FixedString/Map (mapKeys/mapValues 経由) をサポートするほか、サイズ、hash の数、seed を調整できます。詳細は N-gram bloom filter のドキュメントを参照してください。
このガイドでは、token と ngram の実践的な例と、それぞれをどのような場合に使うべきかを紹介します。 パラメータ最適化用ヘルパー関数: ngrambf_v1 の 4 つのパラメータ (n-gram サイズ、bitmap サイズ、ハッシュ関数、seed) は、パフォーマンスとメモリ使用量に大きく影響します。想定される n-gram 数と目標の偽陽性率に基づいて最適な bitmap サイズとハッシュ関数の数を計算するには、以下の関数を使用してください。
チューニングの詳細については、パラメータのドキュメントを参照してください。
全文検索での tokenbf_v1 索引の使用は、ClickHouse バージョン >= 26.2 では text 索引の利用が推奨されるため非推奨となっています (詳細はこちらを参照してください) 。
tokenbf_v1 は、英数字以外の文字で区切られたトークンに対して索引を作成します。hasTokenLIKE の単語パターン、または等価比較/IN と組み合わせて使用してください。String/FixedString/Map 型をサポートしています。 詳細は、Token bloom filter および Bloom filter types の各ページを参照してください。
オブザーバビリティの例と、token と ngram の違いに関するガイダンスについては、こちらを参照してください。

CREATE TABLE時に索引を追加する (複数の例)

スキッピングインデックスは、複合式や Map/Tuple/Nested 型にも対応しています。これについては、以下の例で示します。

既存データへのマテリアライズと検証

既存のデータパーツに対しては MATERIALIZE を使って索引を追加でき、以下のように EXPLAIN やトレースログでプルーニングの状況を確認できます。
このminmax の実例は、EXPLAIN の出力構造とプルーニング件数を示しています。

スキップ索引を使うべき場合と避けるべき場合

スキップ索引を使うべき場合:
  • フィルタ対象の値がデータブロック内でスパースである
  • ORDER BY カラムと強い相関がある、またはデータの取り込みパターンによって似た値がまとまっている
  • 大規模なログデータセットに対してテキスト検索を行う (ngrambf_v1/tokenbf_v1 型)
スキップ索引を避けるべき場合:
  • ほとんどのブロックに少なくとも 1 つは一致する値が含まれている可能性が高い (いずれにしてもブロックが読み込まれる)
  • データの並び順と相関のない、高カーディナリティのカラムでフィルタリングする
重要な注意点ある値がデータブロックに 1 回でも現れると、ClickHouse はそのブロック全体を読み込む必要があります。実際のデータに近いデータセットで索引をテストし、実際の性能測定に基づいて粒度や型固有のパラメータを調整してください。

一時的に索引を無視または強制する

テストやトラブルシューティングの際には、特定の索引を名前で指定して、クエリごとに無効化できます。必要に応じて索引の使用を強制するための設定も用意されています。詳細は ignore_data_skipping_indices を参照してください。

注意事項と留意点

  • スキッピングインデックスは MergeTree ファミリーのテーブル でのみサポートされており、プルーニングは granule/block レベルで行われます。
  • ブルームフィルタベースの索引は確率的です (偽陽性により余分な読み取りが発生することはありますが、有効なデータがスキップされることはありません) 。
  • ブルームフィルタやその他のスキップ索引は EXPLAIN とトレーシングで検証し、プルーニング効果と索引サイズのバランスが取れるように granularity を調整してください。
最終更新日 2026年6月10日