【问题标题】:logarithmic time count(*) range query on any DBMS任何 DBMS 上的对数时间计数 (*) 范围查询
【发布时间】:2014-11-21 02:57:25
【问题描述】:

假设有一个表 T,其列 C 由 B 树索引,并且给定常数 k。假设以下查询的结果为 n:

select count(*) from T where C > k;

我在 MySQL(InnoDB) 中尝试过这样的查询,C 列由 B-tree 索引,发现 n 的值越大,查询越慢。在一张大桌子(GB)上,我什至不得不等待几分钟。因此,我推测时间复杂度与 n 成线性关系。但我知道是否有人在 B-Tree 内部节点上存储聚合信息,这些信息可以在相对于表大小的对数时间内完成。

任何人都可以建议任何实施对数解决方案的 DBMS,或任何减少 MySQL 查询时间的技巧吗?

【问题讨论】:

    标签: sql database algorithm aggregates b-tree-index


    【解决方案1】:

    在看到执行计划之前,你什么都说不出来。至少在 Oracle 中,您还应该在 C 列上有直方图,以便为不同的 C 值制定不同的执行计划。

    索引的深度通常为3-5。对数的底非常大。还要记住,许多数据库在从表中删除行时会作弊,通常叶节点可能指向已删除的行。在 B-tree 中维护聚合值是不值得的,它不会很好地扩展。

    如果您正在寻找具有各种精美索引选项的数据库,请查看 PostreSQL。

    【讨论】:

    • 谢谢。我知道并发控制使事情变得困难。但是,在我目前感兴趣的特定情况下,我没有很多更新,并且我不太关心在插入行时锁定整个表。那怎么样?
    • 恐怕您必须接受数据库是为不同目的而设计的事实。索引在树节点中没有聚合,因为在大多数情况下它们的维护成本很高。但首先你真的应该检查查询的执行计划。
    【解决方案2】:

    是的,所有 DBMS 都支持索引。确保所有 K 字段都已编入索引,据我所知,这是您基本上可以做的唯一一件事。

    这个link 适用于 SQL Server,但它应该可以与 MySql 一起使用(只需很少的修改)。

    不确定,但这个问题看起来与 question on SO 有关。

    【讨论】:

    • 对数索引的唯一方法是使用索引。我还向您推荐此页面(但 DBMS 的语法略有不同):Use the index Luke
    • 请再次阅读我的问题。我已经使用过索引。恕我直言,你误解了我的问题。
    猜你喜欢
    • 2018-08-06
    • 2018-08-06
    • 2017-08-31
    • 2020-11-23
    • 2019-01-24
    • 2018-06-01
    • 2014-05-07
    • 2021-08-17
    • 2015-06-06
    相关资源
    最近更新 更多