首页 > 编程知识 正文

位图索引使用场景(数据库索引键uk_数据库索引-位图索引)

时间:2023-05-03 18:46:06 阅读:123501 作者:2391

在学习hive的过程中遇到了位图索引,并查阅了资料。 现在很难像下面这样管理,但应该是对基础知识的理解吧。

(一)概念介绍:

百度百科:

位图索引主要是为许多具有相同值的列创建的。 例如类别、操作员、部门ID、仓库ID等。 索引块的一个索引行包含键值、开始/结束Rowid以及这些键值的位置代码。 位置代码的各位表示有无与键值对应的数据行。 一个块可能指向几十行到几百行数据的位置。

当然百度百科知道。 看看维客的吧

维基百科:

bitmapindexeshavetraditionallybeenconsideredtoworkwellforlow-cardinality columns,whichaveamodestnumberofdistinctvalues,etvalues orrelativetothenumberofrecordsthatcontainthedata.theextremecaseoflowcardinalityisbooleandata (、which has two values、trueandalues andanswerqueriesbyperformingbitwiselogicaloperationsonthesebitmaps.bitmapindexeshaveasignificantspaceandperformanceadvantage h data.theirdrawbackistheyarelessefficientthanthetraditionalb-treeindexesforcolumnswhosedataisfrequta updated : consequed theyaremoreoftenemployedinread-onlysystemsthatarespecializedforfastquery-e.g .datawarehoussion andgenerallyunsuitableflefatioury

someresearchersarguethatbitmapindexesarealsousefulformoderateorevenhigh-cardinality data (e.g .unique-valued data ) andqueriesaccessmultiplebitmap-indexedcolumnsusingtheand,orxorxmap

ok,翻译应该很简单。

(2)例:

如果看不懂个人资料的话,来看看实例吧:

1 .要求说明:

有一个表叫table

由姓名、性别、婚姻状况三列组成,其中性别只有男女两列,婚姻状况为已婚、未婚、离婚三列,本表共有100w的记录。 目前有一个查询,select * from table where Gender=‘男’and marital=“未婚”

姓名(Name )性别(Gender )婚姻状况(Marital ) )。

ssdlt已婚

李四女已婚

王五男未婚

赵六女离婚

孙七女未婚

.

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之后才解锁。

资料来源:

http://www.360doc.com/content/14/0508/15/11965070_375805586.shtml

https://en.wikipedia.org/wiki/Bitmap_index

http://baike.baidu.com/link?url=V3bMusSRzP6u-1bBHYDX1WeYs2OAmE9v9KKwmVAwRt_Huk7Ky2QmqXgDbdN5oaZtZgh6rPk740r8r8QN6Jdm6_

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