7

我的问题是数据库如何存储数据以及它如何在内部执行查询。

假设我们的表中有以下字段:

  1. ID
  2. 姓名
  3. 年龄
  4. 重量
  5. 经理

我们查询select * from Table1 where age>50 and weight<100

我只是好奇它如何在内部执行查询。

在这个例子中 B-Tre/B+Tree 的节点将包含什么?

4

1 回答 1

6

您选择的示例是单个 Tree 无法完成工作(两个独立范围)的少数情况之一。

然而,我的工作进行中电子书的第一章解释了 B-Tree 索引的内部工作原理:http: //use-the-index-luke.com/anatomy/

编辑以获取更多详细信息,为什么两个索引可能对上述示例有用。

上述查询可由三种可能的索引配置支持:

  1. AGE然后WEIGHT(按此顺序)连接索引。
    以防万一,查询将读取所有记录WHERE AGE > 50,然后按WEIGHT.

  2. WEIGHT然后连接索引AGE(另一个顺序)。
    这是不同的方式:读取所有记录WHERE WEIGHT < 100,然后过滤AGE

哪种更有效取决于您拥有的数据。如果记录AGE > 50少于WEIGHT < 100第一个,则效率更高,否则第二个。但是,如果您使用不同的值进行查询,则图片可能会发生变化。

级联索引不能很好地支持查询的原因是每个索引顺序仅在一个轴上。每个索引条目都在另一个之前或之后,但从不在它旁边。所有索引条目构建一个链。

具有两个独立范围查询的查询需要两个轴,不像链,但更像棋盘。一个轴为另一个AGEWEIGHT。如果可以的话,您的查询将只需要扫描棋盘的一个角。

但是,b 树只有一个轴,因此您必须先选择要使用的标准。如果您选择AGE它意味着从 开始AGE 50,将扫描整个链直到结束。只有存储在链端的一些记录也符合条件WEIGHT < 100,其他记录必须读取但将被丢弃。

所以,长篇大论来解释为什么一棵树不能支持具有两个独立范围子句的查询。另一方面,一个连接索引可以很好地完成以下工作:

WHERE age = 50 AND weight < 100
WHERE weight = 100 AND age > 50
WHERE age > 50 AND age < 70;

但是,如果在两个不同的列上使用了两个不等式运算符,就会出现问题。

那么该怎么办?

第三种可能的方法是在两列上有两个独立的索引。这允许您拥有任意数量的轴(只需创建更多索引)。但是,这样做存在一些巨大的问题。首先,并非所有数据库产品都支持这一点。只要支持它,它就是一个相当广泛的操作。它通常以扫描每个索引的方式工作,为每个结果构建位图索引。然后连接这些位图索引以应用AND运算符。这是大量的数据处理——只有当每个条件对它自己的选择性不是很严格时才值得付出努力,但两者都非常有选择性。

没有我的建议吗?

如果您的查询在 OLTP 环境中运行:使用一个连接索引。两个独立的索引只是最后的选择。但是,如果您在 OLAP 环境中工作,则可能无论如何都需要位图索引。

ps.:索引是我书中AGE的一个练习AGE(有解决方案)——特别是因为存储是一种不好的做法,你应该存储出生日期。

于 2010-10-30T18:21:22.237 回答