【びっとまっぷいんでっくす】

ビットマップインデックス とは?

💡 0と1の羅列でデータを瞬時に絞り込むインデックスの達人
📌 このページのポイント
ビットマップインデックスの仕組み テーブル 性別 1 2 3 4 5 男のビット列 1 0 1 0 1 女のビット列 0 1 0 1 0 AND演算で絞り込み 男 AND 東京 = 1 0 0 0 1 → 行1, 行5がヒット! 得意: カーディナリティ低い列 性別・地域・ステータスなど 苦手: 更新が多いOLTP 1行更新でビット列全体を書換え
ビットマップインデックスのイメージ
ひよこ ひよこ

ビットマップインデックスって、普通のインデックスと何が違うの?

ペンギン先生 ペンギン先生

普通のB-Treeインデックスが「値→行番号のリスト」を持つのに対して、ビットマップインデックスは各値ごとに全行分の0/1のビット列を持つんだ。たとえば性別カラムなら「男=[1,0,1,1,0...]」「女=[0,1,0,0,1...]」みたいな感じだよ

ひよこ ひよこ

それだと何が嬉しいの?

ペンギン先生 ペンギン先生

ビット演算がめちゃくちゃ速いんだよ。「男性かつ東京都」みたいな検索は、男のビット列と東京のビット列をAND演算するだけ。CPUが一度に64ビットまとめて処理できるから、何百万行あっても一瞬で絞り込めるんだ

ひよこ ひよこ

じゃあ全部ビットマップにすればいいんじゃない?

ペンギン先生 ペンギン先生

値の種類が多い列だとビット列が大量に必要になって逆に非効率なんだ。名前やメールアドレスのようにほぼ全行ユニークな列には向かないよ。性別・地域・年代みたいにパターンが限られる列で真価を発揮するんだね

ひよこ ひよこ

どういうシステムで使われてるの?

ペンギン先生 ペンギン先生

データウェアハウスBIツールのバックエンドが多いね。Oracle Databaseにはビットマップインデックスの機能があるし、Apache DruidClickHouseなどの分析系DBも内部的にビットマップを活用しているよ

ひよこ ひよこ

更新が多いシステムだとダメなの?

ペンギン先生 ペンギン先生

そうなんだ。1行更新するだけで該当するビット列全体をロックして書き換える必要があるから、同時更新が多いOLTPだとボトルネックになりやすい。だからOLAP(分析系)向きの技術と言われているよ。圧縮技術(Roaring Bitmapなど)と組み合わせるとさらにメモリ効率が上がるんだ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
ビットマップインデックスって出てきたら「0と1のビット列で高速に検索するインデックス」と思えればだいたいOK!
📖 おまけ:英語の意味
「Bitmap Index」 = ビットマップ索引
💬 Bitmap(ビットの地図)をインデックスに使うから、そのままの名前だよ
← 用語集にもどる