如何在B树上使用暗示OR查询?

时间:2010-08-20 18:04:27

标签: indexing b-tree

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

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

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

当搜索b树时,假设小于6且大于6的密钥位于不同的子树上,而不是当搜索路径通过子树时,该子树包含小于6的密钥。 6,可以重新获得1到5之间的id,但是10到15之间的id是什么?

我是否必须使用b +树,当我找到指向id 1的密钥时,我只是逐个扫描叶节点,直到找到指向id 15的密钥? 这种查询是不好的解决方案: 从表中选择*,其中id介于1和5之间,或者id介于10000000和10000005之间???

或者还有其他解决方案吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

OR操作意味着需要完成两次搜索,并且结果合并。

答案 1 :(得分:1)

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

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

关于 AND :您的示例是一个矛盾(1和5之间的ID AND 10000和10000005之间的ID),查询将不返回任何行。一些优化者能够“看到”那个。

不同列上的

AND 条件将通过连接索引来解决。

有关详细信息,请查看我的网络书Use The Index, Luke!