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,我们会得到很多结果,需要进一步过滤掉(所以不是很有用).位图如何改善这种情况?

推荐答案

如果给出上面的示例,位图索引的更好表示形式是:

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

当一列中不同值的数量相对较少时使用位图索引(考虑相反的情况,所有值都是唯一的:位图索引将与每行一样宽,长度为and,这使其有点像一个大的标识矩阵).

因此,有了这个索引,就会有一个查询,如下所示

SELECT * FROM table1 WHERE gender = 'Male'

数据库在索引中查找性别值的匹配项,找到该位设置为1的所有ROWID,然后转到并获得表结果.

类似于以下查询的查询:

SELECT * FROM table1 WHERE gender IN ('Male', 'Unspecified')

将得到1位表示阳性,1位表示未指定,按位执行,然后得到结果位为1的行.

因此,与b*树索引相比,使用位图索引的优势在于存储(基数较低,位图索引非常紧凑),以及在解析实际rowid之前执行逐位操作的能力,这可能非常快.

请注意,位图索引可能会对插入/删除操作产生性能影响(从概念上讲,您可以在位图中添加/删除列并相应地重新调整它.),并且可能会造成大量争用,因为行上的更新会锁定整个相应的位图条目,并且在提交/回滚第一次更新之前,您不能更新不同的行(具有相同的位图值).

Database相关问答推荐

如何将对象源动态设置为子窗体

如何在mongodb数据库中设置导入的CSV文件的字段之间的关系

如何使用 SQL Server 中的round方法将浮点数转换为 int?

我如何知道 DynamoDB 表分布在多少个分区上?

Select 正确的数据库:MySQL 与Everything 其它数据库

使用 LiquiBase 和 Spring 将大量值(使用 FK)插入数据库

SQLite3 的动态类型

某些网站不允许在密码中使用句点是否有原因?

在数据库中存储枚举值的最佳方式 - String 或 Int

Hibernate、spring、JPS 和隔离 - 不支持自定义隔离

如何在一行中显示 redis 中的所有键?

限制一个 sqlite 表的最大行数

什么是非关系数据库的例子?

如果表不存在,如何使用 Derby Db 创建表

如何在实体框架中使用字符串属性作为主键

MySQL 整数 0 与 NULL

存储信用卡号 - PCI?

关系未更新的 NSFetchedResultsController

如何解析来自 Google 快讯的数据?

清空数据库是什么意思?