首页 > 编程知识 正文

bitmap位图(mysql bitmap 索引_位图索引:原理(BitMap index))

时间:2023-05-05 12:45:41 阅读:123499 作者:1745

位图索引

在此期间,我听同事分享,偶尔聊一聊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的计算机的位图向量都将更改。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。