2

因此,我们即将将 H2 代码移植到一个有 noSQL 存储而不是文件系统上,以便我们在大型系统中使用(尽管有数万亿个较小的索引)。

查看 lucene 和 H2 时,乍一看,如果您索引 4 列(例如 A、B、C、D),它们几乎都使用一个 b-tree,而不是 4 个 b-tree。我在那里有点困惑,因为这意味着我需要查询 A 否则会崩溃,对吗?还是我弄错了,实际上有 4 个 b-tree,当我进行连接时,这意味着我可能需要处理 8 个 b-tree 或其他东西。

有没有关于它如何详细工作的好文章?或者有人可以推荐一些关于这个主题的好书吗?

(我在学校是一名电气工程师,所以从来没有上过数据库编程课:(有点遗憾,但不应该太难赶上)。

谢谢,院长

4

1 回答 1

3

我所知道的所有 SQL DBMS 的每个复合索引只有一个 B-Tree 。我猜任何其他具有“复合索引”概念的系统的行为都是一样的。

在 {A, B, C, D} 上的复合索引的情况下,这棵 B-Tree 将允许您有效地搜索...

  • 一个 = ...
  • A = ... 和 B = ...
  • A = ... 和 B = ... 和 C = ...
  • A = ... AND B = ... AND C = ... AND D = ...

...以及类似的范围搜索。

对于以下情况,它会有些效率:

  • A = ... 和 C = ...
  • A = ... 和 D = ...
  • A = ... 和 C = ... 和 D = ...
  • A = ... 和 B = ... 和 D = ...

并且对于以下情况效率低下

  • 乙 = ...
  • B = ... 和 C = ...
  • B = ... 和 D = ...
  • B = ... 和 C = ... 和 D = ...
  • C = ...
  • D = ...
  • ETC...

换句话说,在索引的前沿搜索是有效的(尽管某些 DBMS,例如 Oracle,可以使用“跳过扫描”进行非前沿搜索)。


另一方面,在 {A}、{B}、{C} 和 {D} 上具有单独的(非复合)索引将导致四个 B 树和一组不同的性能特征。

有关数据库索引如何工作的良好介绍,请查看SQL 索引剖析

于 2012-07-17T15:27:19.373 回答