位图索引如何有用?

时间:2010-08-10 18:59:00

标签: database algorithm database-design indexing bitmap

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

但我不明白这一点。

  • 这首先是一个指数?在给定密钥的情况下,不是指向行(使用rowid)的索引吗?
  • 这些索引有用的典型查询是什么?它们如何比B树索引更好?我知道如果我们在Gender上使用B树索引,我们会得到很多结果,例如,我们会查找Gender = Male,这需要进一步过滤掉(所以不是很有用)。 Bitmap如何改善这种情况?

3 个答案:

答案 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,以确定是否将它们包含在结果中。

前言 - 其余部分是非专业人士和非技术人员

接下来的问题是如何评估为真?即使比较数值也意味着计算机必须......

  1. 为您要评估的值分配内存
  2. 为控制值分配内存
  3. 将值分配给每个(将其计为两步)
  4. 比较两者 - 对于数字,这应该很快,但对于字符串,有更多的字节需要比较。
  5. 将结果分配给0(假)或1(真)值。
  6. 重复,如果您使用的是多部分where子句,例如Where“this = this AND that = that”

    1. 对步骤5中生成的结果执行按位操作
    2. 提出最终价值
    3. 解除分配步骤1-3中分配的内存
    4. 但是使用按位逻辑,你只需要看0(假)和1(真)值。比较工作的90%的开销被消除。