【问题标题】:How can I use imply an OR query on an B-Tree?如何在 B-Tree 上使用隐含 OR 查询?
【发布时间】:2011-04-01 19:21:57
【问题描述】:

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

对于 OR 查询,我的意思是 select * from table where id 介于 1 和 5 之间或 id 介于 10 和 15 之间;

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

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

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

或者有其他解决方案吗?

非常感谢!

【问题讨论】:

    标签: indexing b-tree


    【解决方案1】:

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

    【讨论】:

    • 你的意思是我必须在 b-tree 上搜索两次才能得到结果?那么AND操作呢?只需将查询更改为: select * from table where id between 1 and 5 AND id between 10000000 and 10000005 这个查询怎么样?还要搜索两次?非常感谢!
    • 基本上,是的,对 OR 和 AND 进行两次搜索。您当然可以像 Markus 在下面建议的那样变得更高级,但这更多的是您想让查询引擎变得多么复杂。
    【解决方案2】:

    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 不同列上的条件将通过连接索引来解决。

    查看我的网络书Use The Index, Luke! 了解更多详情。

    【讨论】:

      猜你喜欢
      • 2013-02-13
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2017-03-02
      相关资源
      最近更新 更多