位图索引适合与低聚合度,大型,少量写操作的数据仓库
如性别等字段
如果仅仅在一个字段上建立位图索引,是没有什么效果的
位图索引适合于多个位图索引列联合检索的时候,会有很好的效果
如where a=5 and b=false and c=0假如a,b,c上都有位图索引
------------------
注意,大量写操作的表建立位图索引会降低性能
关于具体的说明,请参考文档
如性别等字段
如果仅仅在一个字段上建立位图索引,是没有什么效果的
位图索引适合于多个位图索引列联合检索的时候,会有很好的效果
如where a=5 and b=false and c=0假如a,b,c上都有位图索引
------------------
注意,大量写操作的表建立位图索引会降低性能
关于具体的说明,请参考文档
1、optimizer_mode初始化参数,其默认值为choose即如一个表有索引,没statistics信息,则表在查询在查询时执行基于规则(rule),否则执行基于代价(cost)的检索方式。2、还有一个重要的因素是表的大小,如果优化器发现表只有几行的数据,即使有索引它也不会考虑的,而不是是否是因为bitmap index的因素。
如果是 select count(*) from test where a=5 ;
应该会使用 bitmap索引的
最好做一次analyze但是 select * from test where a=5 ;
你认为使用索引会比较快么?
假如数据覆盖有 20% ,你认为通过索引会很快?你知道bitmap的索引结构嘛col value bitmap数据(bit)(开始rowid x,终止rowid x+ 14)
1 00011101010101
2 10100000000000
3 01000010000000
4 00000000100000
5 00000000001010上面是一个例子了,包含数据条数为 bit 数量 10条数据,假设数据全部连续存储在磁盘上
这样的结构下
bitmap 只存储了起始rowid 和 结束rowid并且不用重复的保存column value
从而降低了IO
注意这一句话
the optimizer felt pretty sure that 1/3(一个比较大的数值) of the table
would be accessed via the index and hence a full scan was in order