B-Tree vs Bitmap 数据库索引

Posted

技术标签:

【中文标题】B-Tree vs Bitmap 数据库索引【英文标题】:B-Tree vs Bitmap database indexes 【发布时间】:2012-03-02 22:57:30 【问题描述】:

谁能解释位图和b树索引之间的区别。在什么情况下你会使用这两种方法?每个人的优点/缺点是什么。

【问题讨论】:

不是作业,但我正在读一本关于 oracle 的书,并且真的不了解这两种类型的索引。必须学习 oracle 以使自己在办公室有用。 【参考方案1】:

来自***:B-Trees 和 bitmap indexes。用例:

B-Trees 是在数据库中执行CREATE INDEX ... 时使用的典型索引类型:

    当您只选择索引数据的一小部分(通常最大为 5%-10%)时,它们的速度非常快
当您有很多不同的索引值时,它们会更好地工作。 可以合并多个 B 树索引,但更简单的方法通常更有效。 当索引数据的不同值很少,或者当您想要获取大量(通常>10%)数据子集时,它们没有用处。 在索引表上插入/更新值时,每个 B-Tree 索引都会施加少量惩罚。如果您在一个非常繁忙的表中有很多索引,这可能是个问题。

此特性使 B-Tree 索引对于加速 OLTP 应用程序中的搜索非常有用,当您一次处理非常小的数据集时,大多数查询按 ID 过滤,并且您希望获得良好的并发性能。

位图索引是一种更专业的索引变体:

    它们将索引值编码为位图,因此非常节省空间。 当不同的索引值很少时,它们往往会更好地工作 DB 优化器可以很容易地组合多个索引位图,这允许在查询中高效执行复杂的过滤器。 它们在插入/更新值时效率非常低。

位图索引主要用于数据仓库应用中,除了ETL过程之外,数据库是只读的,并且您通常需要针对star schema执行复杂的查询,其中位图索引可以加速基于过滤的维度表中的条件,这些条件通常没有太多不同的值。

作为一个非常简短的总结:使用 B-Tree 索引(大多数数据库中的“默认”索引),除非您是数据仓库开发人员并且知道您将从位图索引中受益。

【讨论】:

【参考方案2】:

当使用普通的 BTree 索引时,所有列值为空的行都会从索引中排除。这意味着具有“列为空”条件的查询不会从普通索引中受益。

通过在 (column_name, 1)(或其他一些常量)上创建索引,现在包含空值列,允许优化器在执行“为空”查询时使用该查询。

与 B*Tree 索引不同,位图索引自动包含空值。这意味着优化器可以在评估“is null”谓词时使用位图索引。

位图索引可能会导致并发问题,但可能会阻塞同一张表上的其他 DML。因此,在 OLTP 应用程序中应该避免这些。位图索引也需要企业版,因此​​使用这些可能会涉及许可问题。

【讨论】:

以上是关于B-Tree vs Bitmap 数据库索引的主要内容,如果未能解决你的问题,请参考以下文章

各种Oracle索引类型介绍

高性能mysql 第5章 创建高可用的索引

Mysq数据库索引(B-Tree索引)

索引的分类--B-Tree索引和Hash索引

Mysql B-Tree和B+Tree索引

Mysql索引原理B-Tree, B+Tree