本文主要介绍“位图索引的实例分析”。在日常操作中,相信很多人对BitMap Index的实例分析有所怀疑。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮你解答“位图索引实例分析”的疑惑!接下来,请和边肖一起学习!
00-1010有一个名为table的表,由姓名、性别、婚姻状况三列组成,其中只有两种性别,婚姻状况有三种,分别是已婚、未婚、离异。此表中有100条记录。现在有这样一个查询:从表中选择*其中性别='男性',婚姻状况='未婚';
姓名(Name)
性别(Gender)
婚姻状况(Marital)
张三
男人
已婚的
Lisi
妇女
已婚的
王武
男人
未婚
刘钊
妇女
离婚
孙棋
妇女
未婚
...
...
...
1.不使用索引:当不使用索引时,数据库只能逐行扫描所有记录,然后判断记录是否满足查询条件。
2.b树索引
就性别而言,理想值的范围只有“男性”和“女性”,男性和女性各占本表数据的50%。此时添加B-tree索引还是需要取出一半的数据,完全没有必要。相反,如果某个字段的取值范围很广,几乎没有重复,比如身份证号,此时使用B树索引较为合适.事实上,当提取的行数据占据了表中的大部分数据时,即使添加了B-tree索引,oracle和mysql等数据库也不会使用B-tree索引,很可能所有的行都会被扫描。
1. 案例
如果用户查询的列基数很小,也就是只有几个固定值,比如性别、婚姻状况、行政区域等等。要用小的基值索引这些列,有必要建立位图索引。
对于性别列,位图索引形成两个向量,男性向量为10100.并且向量的每个比特指示该行是否是男性;如果是,则为位1,否为0;类似地,母向量是比特01011。
RowId
1
2
3
4
5
...
男人
一个
0
一个
0
0
妇女
0
一个
0
一个
一个
对于婚姻状况这一列,位图索引生成三个向量,分别是已婚11000,未婚00100,离异00010。
RowId
1
2
g>
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...,将两个向量做与操作,这时生成新向量00100...,可以发现第三位为1,表示该表的第三行数据就是我们需要查询的结果。
RowId |
1 |
2 |
3 |
4 |
5 |
男 |
1 |
0 |
1 |
0 |
0 |
& |
|
|
|
|
|
未婚 |
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举例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/137957.html