位图索引

位图索引(Bitmap-Index)是一个性能强大,但是稍微使用不当就反而降低性能的索引类型,一般用于给枚举做索引

SELECT count(*) FROM INV_SKU_PHOHE WHERE VENDOR IN ('HAUWEI', 'XIAOMI', 'APPLE')

上面就统计了三个厂商的库存

位图在更新索引时,是整个表都会锁住,重新计算所有的BitArray,但是它又没有像Redis那样的渐进式rehash,因此相对于B-tree更重,不适合频繁输入不同的数据。

生成的索引例子

比如有如下数据

RIDNAMEVENDOR
1AHAUWEI
2BXIAOMI
3CHAUWEI
4DHAUWEI
5EAPPLE

由于有三个索引,将生成如下索引(注意下文Bit-Array是数组,而不是字符串)

R1R2R3R4R5
HAUWEI10110
XIAOMI01000
APPLE00001
Bit-Array00010010000100010100

最终当搜索HUAWEI时,可以理解为进行BIT-OR运算

QUERYROWbitwise-OR
000100011
000100100
000100011
000100011
000101000

这样就查出来了,由于Bitwise运算非常简单,因此查询速度较快

使用场景

一般用于高读低写的场景,可以在晚上离线生成,但是非实时数据

  • 数据仓库(data warehouses),比如BOM数据库,卡号数据库,采购数据库
  • 报表生成与查询业务

替代工具(alternative)

Elastic等全文检索工具的keyword类型,它将不进行分词(not_analyzed)而精确存储

PUT inv_sku_phone
{
  "mappings": {
    "_doc": {
      "properties": {
        "vendor": {
          "type":  "keyword"
        }
      }
    }
  }
}