位图索引
在此期间,我听同事分享,偶尔聊一聊Oracle数据库的位图索引,顿时产生了兴趣。 虽然很不好意思,但是到目前为止我对位图索引一无所知,所以我想借此机会写一篇博文介绍位图索引。
1 .案例
有一个名为table的表。 它由三列组成:姓名、性别和婚姻状况。 其中性别只有男女两种,婚姻状况为已婚、未婚、离婚三种,这张表上有100瓦的记录。 目前,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。
原始身份
1
2
3
4
5
.
男人
1
0
1
0
0
女人
0
1
0
1
1
对于婚姻状况这一列,位图索引生成三个向量:已婚11000 .未婚00100 .离婚00010 .
原始身份
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。 指示此表第三行中的数据是需要查询的结果。
原始身份
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值。 例如,updatetablesettable.busy=1where rowid=100; 但是,还没有commit,用户b也使用update更新另一台计算机上的busy值。 updatetablesettable.busy=1where rowid=12; 此时,用户b很难更新。 必须等待用户A commit。
原因:如果用户a将计算机的busy值更新为1,则数据库将锁定busy=1的所有行,并且仅在commit之后解锁,因为所有busy为1的计算机的位图向量都将更改。