位图(BitMap)索引

1. 案例

  有张表名为table的表,由三列组成,分别是姓名、性别和婚姻状况,其中性别只有男和女两项,婚姻状况由已婚、未婚、离婚这三项,该表共有100w个记录。现在有这样的查询:     select * from table where Gender=‘男’ and Marital=“未婚”;

姓名(Name)

性别(Gender)

婚姻状况(Marital)

张三

已婚

李四

已婚

王五

未婚

赵六

离婚

孙七

未婚

...

...

...

1)不使用索引

  不使用索引时,数据库只能一行行扫描所有记录,然后判断该记录是否满足查询条件。

2)B树索引

  对于性别,可取值的范围只有'男','女',并且男和女可能各站该表的50%的数据,这时添加B树索引还是需要取出一半的数据, 因此完全没有必要。相反,如果某个字段的取值范围很广,几乎没有重复,比如身份证号,此时使用B树索引较为合适。事实上,当取出的行数据占用表中大部分的数据时,即使添加了B树索引,数据库如oracle、mysql也不会使用B树索引,很有可能还是一行行全部扫描。

2. 位图索引出马

如果用户查询的列的基数非常的小, 即只有的几个固定值,如性别、婚姻状况、行政区等等。要为这些基数值比较小的列建索引,就需要建立位图索引。

对于性别这个列,位图索引形成两个向量,男向量为10100...,向量的每一位表示该行是否是男,如果是则位1,否为0,同理,女向量位01011。

RowId

1

2

3

4

5

...

1

0

1

0

0

0

1

0

1

1

  对于婚姻状况这一列,位图索引生成三个向量,已婚为11000...,未婚为00100...,离婚为00010...。

RowId

1

2

3

4

5

...

已婚

1

1

0

0

0

未婚

0

0

1

0

1

离婚

0

0

0

1

0

  当我们使用查询语句“select * from table where Gender=‘男’ and Marital=“未婚”;”的时候 首先取出男向量10100...,然后取出未婚向量00100...,将两个向量做and操作,这时生成新向量00100...,可以发现第三位为1,表示该表的第三行数据就是我们需要查询的结果。

RowId

1

2

3

4

5

1

0

1

0

0

and

未婚

0

0

1

0

1

结果

0

0

1

0

0

3.位图索引的适用条件

  上面讲了,位图索引适合只有几个固定值的列,如性别、婚姻状况、行政区等等,而身份证号这种类型不适合用位图索引。

  此外,位图索引适合静态数据,而不适合索引频繁更新的列。举个例子,有这样一个字段busy,记录各个机器的繁忙与否,当机器忙碌时,busy为1,当机器不忙碌时,busy为0。

  这个时候有人会说使用位图索引,因为busy只有两个值。好,我们使用位图索引索引busy字段!假设用户A使用update更新某个机器的busy值,比如update table set table.busy=1 where rowid=100;,但还没有commit,而用户B也使用update更新另一个机器的busy值,update table set table.busy=1 where rowid=12; 这个时候用户B怎么也更新不了,需要等待用户A commit。

  原因:用户A更新了某个机器的busy值为1,会导致所有busy为1的机器的位图向量发生改变,因此数据库会将busy=1的所有行锁定,只有commit之后才解锁。

位图索引:原理(BitMap index)相关推荐

  1. mysql bitmap index_oracle 位图索引(bitmap index)

    今天研究下oracle中的位图索引,通过这边文章你会了解到,什么是位图索引?,什么情况下应该使用位图索引?位图索引的检索数据的过程,以及位图索引的弊端? 一:什么是位图索引? 位图索引是从oracle ...

  2. 位图索引(bitmap index)冲突引起的TX锁争用

    B*Tree索引的叶节点以排序形式存储索引条目,每个索引条目指向各自的一个rowid.所以唯一键冲突之外,索引条目之间不发生争用.而位图索引的叶节点具有 "column值+start row ...

  3. 位图索引(Bitmap Index)——位图索引与数据DML锁定

    位图索引相对于传统的B*树索引,在叶子节点上采用了完全不同的结构组织方式.传统B*树索引将每一行记录保存为一个叶子节点,上面记录对应的索引列取值和行rowid信息.而位图索引将每个可能的索引取值组织为 ...

  4. 浅析位图索引(bitmap index)

    位图索引基本概念 位图索引是一种很高效的索引结构,对于多属性过滤的聚合查询很高效,玩的就是 bit. 位图:位(bit)的一个简单数组,比如 001010,这个位数就是 6. 位图索引:假如建立在一个 ...

  5. 位图索引(bitmap index)

    位图索引是一种很高效的索引结构,对于多属性过滤的聚合查询很高效,玩的就是 bit. 本文预计阅读时间 3 分钟. 位图索引基本概念 位图:位(bit)的一个简单数组,比如 001010,这个位数就是 ...

  6. mysql bitmap index_位图索引:原理(BitMap index)

    位图(BitMap)索引 前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣.说来惭愧,在这之前对位图索引一无所知,因此趁此机会写篇博文介绍下位图索引. 1. 案例 有张表名为ta ...

  7. oracle 位图索引 原理,数据库教程:Oracle 位图索引叙述

    在Oracle数据库学习中,出现"位图索引"时,你知道是什么吗?位图索引是Oracle较为引人注目的地方,其主要用在OLAP方面,也就是数据仓库方面用到,目的是在加快查询速度是,节 ...

  8. 位图索引Bitmap indexes(数据库索引)

    位图索引是一种使用位图的特殊数据库索引.主要针对大量相同值的列而创建,比如(性别.婚配等字段可选值很少的字段创建位图索引): oracle 位图索引(bitmap index)_ITPUB博客 详解o ...

  9. Oracle 之索引,妙不可言(四)——位图索引

    位图索引​​​ CREATE BITMAP INDEX index_name ON table_name(column_list); 卓越性能展现 统计条数奋勇夺冠 count() 性能 在非空列有B ...

最新文章

  1. Struts2的拦截器只允许有权限用户访问action
  2. 电信运营商如何玩转大数据?
  3. HashMap 详解七
  4. java练习:模拟试下你斗地主的洗牌、发牌、看牌功能
  5. element ui中走马灯放图片
  6. 15、Java并发编程:Callable、Future和FutureTask
  7. llinux 调整swap方法
  8. 学生信息管理系统c语言课设,学生信息管理系统C语言课设.doc
  9. CASE WHEN 小结
  10. 《大型网站技术架构》《K8S进阶实战》等书籍!送45本!
  11. 小学生计算机编程题,真题|小学组倒数第二道编程题,做不出来罚你点赞三遍!...
  12. GEO数据库学习二(ID转换)
  13. iframe标签全屏
  14. Git Bash Here常用命令以及使用步骤
  15. 搜索框实现模糊查询方法 - js
  16. NewStarCTF 公开赛赛道week3 web writeup
  17. 如何恢复 Linux 上删除的文件
  18. list和tuple的区别:
  19. linux 文件双向同步,Linux文件双向实时同步rsync
  20. 虚拟局域网软件开源_软件定义汽车 (第十集):决战架构之巅

热门文章

  1. 目标检测经典网络——R-FCN网络介绍
  2. qt中ShellExecute、ShellExecuteEx和WinExec的用法和区别
  3. VC 比拼 Delphi(1)!
  4. uniapp使用uni.createInnerAudioContext()实现在app 小程序 h5有声书的播放
  5. 〖Python 数据库开发实战 - Python与MySQL交互篇②〗- SQL 注入攻击案例
  6. queryset问题
  7. 囚徒困境——从博弈论的角度解释“美女配丑男”
  8. 关于flex布局在IE浏览器上的坑
  9. 用于认证呼叫者企业身份的分布式账本用例
  10. 【新星计划python赛道】pygame让你一步步实现翻牌游戏(金币旋转、大头贴等),打造更有趣的新星之旅