0

我想使用 b-tree 作为索引,但我想不出 OR 查询的解决方案。

对于 OR 查询,我的意思是 select * from table where id between 1 and 5 OR id between 10 and 15;

如果我使用 id 作为 b-tree 中的键,那么如何在 b-tree 上进行上述查询?

通过b-tree搜索时,假设小于6和大于6的key在不同的子树上,而不是搜索路径经过包含小于6的key的子树时,id 1 到 5 之间的可以检索,但是 10 到 15 之间的 id 呢?

我是否必须使用 b+tree,当我找到指向 id 1 的键时,我只是一个接一个地扫描叶子节点,直到找到指向 id 15 的键?这种查询是不好的解决方案:select * from table where id between 1 and 5 OR id between 10000000 and 10000005???

或者有没有其他解决方案?

非常感谢!

4

2 回答 2

1

OR关键字是一个常见问题。从索引的角度来看,通常最好进行两次查找(例如,像 UNION)。

但是,也有例外。您的第一个示例(id 介于 1 和 5 之间或 id 介于 10 和 15 之间)可能最好在从 1 到 15 的一次索引查找中完成,丢弃值 6-9。但是,这取决于数据量!您的第二个示例(1 到 5 或 10000000 到 10000005 之间的 id)看起来不是该方法的好候选者。但是,它取决于行数,而不是 id 的数量。

关于AND:您的示例是矛盾的(1 和 5 之间的 id 和 10000000 和 10000005 之间的 id),查询不会返回任何行。一些优化器能够“看到”这一点。

不同列上的AND条件将通过连接索引来解决。

看看我的网络书使用索引,卢克!了解更多详情。

于 2010-08-23T06:11:14.530 回答
1

OR 操作意味着需要进行两次搜索,并将结果合并。

于 2010-08-20T18:13:51.310 回答