Wikipedia给出了这个例子
Identifier Gender Bitmaps
F M
1 Female 1 0
2 Male 0 1
3 Male 0 1
4 Unspecified 0 0
5 Female 1 0
但我不明白这一点。
Gender
上使用B树索引,我们会得到很多结果,例如,我们会查找Gender = Male
,这需要进一步过滤掉(所以不是很有用)。 Bitmap如何改善这种情况?答案 0 :(得分:36)
如果给出上面的示例,则更好地表示位图索引:
Identifier Gender RowID
1 Female R1
2 Male R2
3 Male R3
4 Unspecified R4
5 Female R5
性别列上的位图索引(概念上)将如下所示:
Gender R1 R2 R3 R4 R5
Female 1 0 0 0 1
Male 0 1 1 0 0
Unspecified 0 0 0 1 0
当列中不同值的数量相对较低时使用位图索引(考虑所有值都是唯一的相反位置:位图索引与每行一样宽,和尽可能长使它有点像一个大的单位矩阵。)
因此,使用此索引就可以获得类似
的查询SELECT * FROM table1 WHERE gender = 'Male'
数据库在索引中的性别值中查找匹配项,找到该位设置为1的所有rowid,然后去获取表结果。
如下的查询:
SELECT * FROM table1 WHERE gender IN ('Male', 'Unspecified')
将为Male获取1位,为Unspecified获取1位,按位执行-OR然后获取结果位为1的行。
因此,使用位图索引优于ab *树索引的优点是存储(基数低,位图索引非常紧凑),并且能够在解析实际rowid之前执行按位操作,这可能非常快。< / p>
请注意,位图索引可能会对插入/删除产生性能影响(从概念上讲,您可以在位图中添加/删除列并相应地重新调整它...),并且可以创建大量争用作为更新一行可以锁定整个相应的位图条目,并且在第一次更新提交/回滚之前,您无法更新不同的行(具有相同的位图值)。
答案 1 :(得分:12)
在对多列进行过滤时会产生好处,然后在实际选择数据之前,可以将相应的索引与按位运算合并。 如果你有性别,eye_colour,hair_colour 然后查询
select * from persons where
gender = 'male' and
(eye_colour = 'blue' or hair_colour = 'blonde')
首先在eye_colour ['blue']索引和hair_colour ['blonde']索引之间或者在结果和性别['male']索引之间进行逐位或者按位。此操作在计算和I / O方面都执行得非常快 生成的比特流将用于选择实际行。
位图索引通常用于数据仓库应用程序中的“星形连接”。
答案 2 :(得分:4)
如维基百科文章所示,他们使用按位运算,这比比较整数等数据类型的性能更好,因此简短的答案是提高查询速度。
从理论上讲,从你的例子中选择所有男性或所有女性应该花费更少的计算和更少的时间。
只要想一想它是如何在幕后工作的,就应该明白这一点为何更明显。逻辑上有点是真或假。如果要使用WHERE子句进行查询,最终将对记录求值为true或false,以确定是否将它们包含在结果中。
前言 - 其余部分是非专业人士和非技术人员
接下来的问题是如何评估为真?即使比较数值也意味着计算机必须......
重复,如果您使用的是多部分where子句,例如Where“this = this AND that = that”
但是使用按位逻辑,你只需要看0(假)和1(真)值。比较工作的90%的开销被消除。