Bitmap Indexing(位图索引)

这篇文章用一个包含 `Job` 和 `Sex` 字段的简单员工表示例,介绍了 Bitmap Indexing 的基本存储方式和查询优势。正文先说明 bitmap 索引会为每种取值维护一段位图,并展示如何通过按位与运算快速筛选同时满足多个条件的记录,随后将这种做法与传统 B+ 树在多条件分析场景下的开销进行对比,最后总结了 bitmap 索引适合低基数字段、OLAP 多维分析和逻辑运算场景,以及在高基数字段和频繁更新场景下的局限。

Bitmap Indexing 顾名思义,使用位图实现索引。广泛应用于大规模数据查询,OLAP 数据库。

为证明位图索引的优势,下面假设了一张数据表 employee。ID 为员工 ID,自增主键,唯一。Job 只含有 A,B 和 C 三种类型。Sex 则只有男和女两种类型。

IDJobSex
1A
2B
3A
4C

因我们需要频繁的对 employee 表进行分析,故在 Job 和 Sex 列上均建立 bitmap 索引。ID 因其为自增序列,本身就有索引,不需要额外创建。

Bitmap 存储格式

这里我不具体讲解 bitmap 索引的规则,直接给例子,其实一看就能懂。

对 Job 建立 bitmap 索引时,会创建“三个索引“,存储的格式如下:

JobBitmap
A1010
JobBitmap
B0100
JobBitmap
C0001

这也看到为每一种 Job 类型都建立了一个 bitmap。Bitmap 中 1 代表有,0 代表没。Job = A 的 bitmap 中 1010 代表 ID = 1ID = 3 的 Job 为 A。

同理,Sex 建立 bitmap 后的存储格式为:

SexBitmap
0110
SexBitmap
1001

Bitmap 优势

假设我们执行如下 SQL 语句,查询所有 Job = ASex = 女 的员工。

SELECT *
    FROM employee
    WHERE Job = "A" and Sex = "女";

这时数据库可以采用位运算一步到位:

索引Bitmap
Job = “A”1010
Sex = “女”1001
执行 AND 位运算&
结果1000

结果是 1000 ,也就是 ID = 1 的员工符合该要求。

如果采用传统的 B+ 树,那么就会很复杂。首先你要过滤出所有 Job = “A” 的用户,然后再过滤 Sex = “女” 的用户。考虑到 B+ 树复杂的结构,整体的开销很高。

如果这张表有 100 列,然后我使用 20 列作为查询条件,那么使用 B+ 树的效率会十分低下,甚至可能不如使用顺序遍历来得快。而 Bitmap 索引使用位运算,就能轻轻松松处理这种事情。

总结

最后总结下 bitmap 索引的优点和缺点。

优点:

  • 适用于重复度高的列(low cardinality),比如上面的 Job 和 Sex 列,只有固定的几种值。
  • 适合执行逻辑运算,如 COUNT,AND,OR 等等,这些可以对 bitmap 进行位运算高效的实现。
  • 适合多维分析的场景,即 OLAP 场景,比如一张表有上百列这样。

缺点:

  • 不合适用在重复度低的列,比如身份证号码。在重复度低的列上建立 bitmap 索引,会耗费大量的空间。
  • 如果在重复度过高的列,如性别,可以建立 bitmap 索引,但不建议单独作为查询条件使用,建议与其他条件共同过滤(将来再补充)。
  • 不适合用在需要频繁更新的列。因为一个 bitmap 会涉及到很多行,如果同时修改,涉及到的锁开销很大(将来再补充)。

参考资料

原创文章,作者:Smith,如若转载,请注明出处:https://www.inlighting.org/archives/what-is-bitmap-indexing

打赏 微信扫一扫 微信扫一扫
SmithSmith
上一篇 2022年2月2日 下午2:19
下一篇 2023年10月1日 下午10:12

相关推荐

  • StarRocks Docker 开发环境搭建指南

    这篇文章介绍了如何借助 Docker 为 StarRocks 构建统一的开发环境,重点解决 BE 本地编译复杂、依赖沉重以及远程调试不便的问题。正文先分析这套方案在 thirdparty 编译、链接速度、SSH 远程开发、GDB 调试和端口隔离上的优势与限制,再说明镜像、目录映射和容器启动方式,随后分别比较 VS Code、Jetbrains Gateway 和代码同步式远程开发的使用体验,并给出 FE 与 BE 的远程 Debug 配置方法和一些实际开发中的注意事项。

    2022年7月30日
    7.0K34
  • 2021 CMU 15-445 实验笔记

    这篇文章记录了作者完成 2021 CMU 15-445 数据库课程各个项目时的实现思路与踩坑经验,内容覆盖 Buffer Pool、Extendible Hash Table、查询执行器和事务并发控制。正文先概述课程价值和各个 Project 的难度排序,再分别总结 LRU Replacement Policy、Buffer Pool Manager、并行 Buffer Pool、可扩展哈希表的桶与目录设计、Volcano 模型下的执行器实现,以及事务相关模块的关键注意点。文章除了复盘代码层面的实现细节,也强调了配合课程 PPT 和数据库教材理解查询处理、事务与并发控制的重要性。

    2022年2月2日
    15.3K204
  • OceanBase Mac/Win Clion 开发环境搭建

    这篇文章介绍了如何在 Mac 和 Windows 环境下借助 OrbStack、WSL2 和远端 Ubuntu,为 OceanBase 配置一套可用的 Clion 开发环境。正文先说明目标是让本机只负责写代码与索引,远端负责编译部署,再逐步介绍基础环境准备、OceanBase 编译与部署、Clion 的 Toolchains、CMake、Deployment 和 gcc/clang 头文件配置,以及第三方库 headers 的同步方法,最后补充了直接打开远端工程、调整 Clion JVM 内存和清理 cache 等使用建议。

    2025年1月29日
    1.6K4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注


评论列表(2条)

  • 油屋
    油屋 2022年8月3日 下午3:09

    优点中的最后一条的“OLTP”应该打错了吧,是“OLAP”吧?,因为OLAP型数据库的更新较少,OLTP型数据库的更新操作较多。