位图索引
位图索引(Bitmap-Index)是一个性能强大,但是稍微使用不当就反而降低性能的索引类型,一般用于给枚举做索引
SELECT count(*) FROM INV_SKU_PHOHE WHERE VENDOR IN ('HAUWEI', 'XIAOMI', 'APPLE')
上面就统计了三个厂商的库存
位图在更新索引时,是整个表都会锁住,重新计算所有的BitArray,但是它又没有像Redis那样的渐进式rehash,因此相对于B-tree更重,不适合频繁输入不同的数据。
生成的索引例子
比如有如下数据
RID | NAME | VENDOR |
---|---|---|
1 | A | HAUWEI |
2 | B | XIAOMI |
3 | C | HAUWEI |
4 | D | HAUWEI |
5 | E | APPLE |
由于有三个索引,将生成如下索引(注意下文Bit-Array是数组,而不是字符串)
R1 | R2 | R3 | R4 | R5 | |
---|---|---|---|---|---|
HAUWEI | 1 | 0 | 1 | 1 | 0 |
XIAOMI | 0 | 1 | 0 | 0 | 0 |
APPLE | 0 | 0 | 0 | 0 | 1 |
Bit-Array | 0001 | 0010 | 0001 | 0001 | 0100 |
最终当搜索HUAWEI
时,可以理解为进行BIT-OR运算
QUERY | ROW | bitwise-OR |
---|---|---|
0001 | 0001 | 1 |
0001 | 0010 | 0 |
0001 | 0001 | 1 |
0001 | 0001 | 1 |
0001 | 0100 | 0 |
这样就查出来了,由于Bitwise运算非常简单,因此查询速度较快
使用场景
一般用于高读低写的场景,可以在晚上离线生成,但是非实时数据
- 数据仓库(data warehouses),比如BOM数据库,卡号数据库,采购数据库
- 报表生成与查询业务
替代工具(alternative)
Elastic等全文检索工具的keyword类型,它将不进行分词(not_analyzed)而精确存储
PUT inv_sku_phone
{
"mappings": {
"_doc": {
"properties": {
"vendor": {
"type": "keyword"
}
}
}
}
}