- 上篇文章提到了数据结构位图,位图是利用bit数组来存储数据的结构,由于bit是计算机的最小存储单位,因此这种数据结构是非常节省存储空间的;同时计算机本来就是二进制的运算,利用位图来进行一些查找/去重操作是比较快的,这篇文章来谈谈数据库中的位图索引
一、案例分析
name | gender | maritalstatus |
---|---|---|
阿虎 | male | 已婚 |
阿杰 | male | 未婚 |
阿吉 | female | 已婚 |
阿白 | female | 离婚 |
阿彪 | male | 未婚 |
… | … | … |
如想查出所有已婚的女性,转换成sql为:select * from t where t.gender = ‘female’ and maritalstatus = ‘已婚’;
1、不使用任何索引,就会全表扫描
2、使用索引:
1)B+Tree/BTree索引,都是使用多叉树的形式,因为性别和婚姻状况基本都占50%数据,基本要取出一半数据,要扫描多次BTree,所以完全没有必要;若是列重复值少,且基数大,可以考虑使用BTree索引
2)位图索引
类似于BitMap,生成只包含0和1的数组,比如male,每列若是male就标为1,若是female就标为0;female相反
Rowid | 1 | 2 | 3 | 4 | 5 | … |
---|---|---|---|---|---|---|
male | 1 | 1 | 0 | 0 | 1 | … |
female | 0 | 0 | 1 | 1 | 0 | … |
Rowid | 1 | 2 | 3 | 4 | 5 | … |
---|---|---|---|---|---|---|
已婚 | 1 | 0 | 1 | 0 | 0 | … |
未婚 | 0 | 1 | 0 | 0 | 1 | … |
离婚 | 0 | 0 | 0 | 1 | 0 | … |
当使用上述sql进行查询时
Rowid | 1 | 2 | 3 | 4 | 5 | … |
---|---|---|---|---|---|---|
female | 0 | 0 | 1 | 1 | 0 | … |
位与(&) | ||||||
已婚 | 1 | 0 | 1 | 0 | 0 | … |
result | 0 | 0 | 1 | 0 | 0 | … |
可以看出result为1的在第三行,第三行是满足条件的
二、适用场景
- 数据库中列基数比较少,且有大量重复值
- 不适用于OLTP场景,或经常更新的列
- 不适用于重复度过低的列,逻辑与、或运算很快,不建议作为单列查询
参考链接:位图索引理解