各セクションでは、サンプルデータを使った例を示し、クエリ実行時に索引が使用されていることを確認する方法を説明します。
MinMax索引
minmax索引は、大まかにソートされたデータや、ORDER BYと相関のあるカラムに対する範囲条件に最適です。
EXPLAIN とプルーニングを用いた実例をご覧ください。
Set 索引
set 索引を使用してください。各ブロックに異なる値が多数含まれる場合は、あまり効果がありません。
全文検索向けのテキスト索引 (text)
text は、トークン化されたテキストデータに対する転置索引です。
全文検索ワークロード向けに設計されており、トークンや検索語の効率的かつ決定論的なルックアップを可能にします。
自然言語検索や大規模なテキスト検索のユースケースに推奨されます。
詳細と使用例については、テキスト索引を使った全文検索をご覧ください。
汎用 Bloom filter (スカラー)
bloom_filter 索引は、“干し草の山から針を探す”ような等価比較や IN による存在確認に適しています。オプションのパラメータとして、偽陽性率 (デフォルトは 0.025) を指定できます。
部分文字列検索向け N-gram Bloom filter (ngrambf_v1) (非推奨)
ClickHouse バージョン
>= 26.2 では、全文検索での ngrambf_v1 索引の使用は非推奨となっており、代わりに text 索引の使用が推奨されています (詳細はこちらを参照してください) 。ngrambf_v1 索引は文字列を N-gram に分割します。LIKE '%...%' クエリに適しており、String/FixedString/Map (mapKeys/mapValues 経由) をサポートするほか、サイズ、hash の数、seed を調整できます。詳細は N-gram bloom filter のドキュメントを参照してください。
単語ベースの検索用 Token Bloom filter (tokenbf_v1) (非推奨)
全文検索での
tokenbf_v1 索引の使用は、ClickHouse バージョン >= 26.2 では text 索引の利用が推奨されるため非推奨となっています (詳細はこちらを参照してください) 。tokenbf_v1 は、英数字以外の文字で区切られたトークンに対して索引を作成します。hasToken、LIKE の単語パターン、または等価比較/IN と組み合わせて使用してください。String/FixedString/Map 型をサポートしています。
詳細は、Token bloom filter および Bloom filter types の各ページを参照してください。
CREATE TABLE時に索引を追加する (複数の例)
Map/Tuple/Nested 型にも対応しています。これについては、以下の例で示します。
既存データへのマテリアライズと検証
MATERIALIZE を使って索引を追加でき、以下のように EXPLAIN やトレースログでプルーニングの状況を確認できます。
スキップ索引を使うべき場合と避けるべき場合
- フィルタ対象の値がデータブロック内でスパースである
ORDER BYカラムと強い相関がある、またはデータの取り込みパターンによって似た値がまとまっている- 大規模なログデータセットに対してテキスト検索を行う (
ngrambf_v1/tokenbf_v1型)
- ほとんどのブロックに少なくとも 1 つは一致する値が含まれている可能性が高い (いずれにしてもブロックが読み込まれる)
- データの並び順と相関のない、高カーディナリティのカラムでフィルタリングする
重要な注意点ある値がデータブロックに 1 回でも現れると、ClickHouse はそのブロック全体を読み込む必要があります。実際のデータに近いデータセットで索引をテストし、実際の性能測定に基づいて粒度や型固有のパラメータを調整してください。
一時的に索引を無視または強制する
ignore_data_skipping_indices を参照してください。
注意事項と留意点
- スキッピングインデックスは MergeTree ファミリーのテーブル でのみサポートされており、プルーニングは granule/block レベルで行われます。
- ブルームフィルタベースの索引は確率的です (偽陽性により余分な読み取りが発生することはありますが、有効なデータがスキップされることはありません) 。
- ブルームフィルタやその他のスキップ索引は
EXPLAINとトレーシングで検証し、プルーニング効果と索引サイズのバランスが取れるように granularity を調整してください。