任何DBMS上的对数时间计数(*)范围查询

时间:2014-09-26 06:58:52

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

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

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

我在MySQL(InnoDB)中尝试了这样的查询,其中列C由B树索引,并且实现了n的值越大,查询越慢。在一张大桌子(GB)上,我甚至要等几分钟。因此,我推测时间复杂度相对于n是线性的。但我知道是否存储了B-Tree内部节点上的聚合信息,这些信息可以在对数时间内相对于表的大小来完成。

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

2 个答案:

答案 0 :(得分:1)

在看到执行计划之前,你无法告诉任何事情。至少在Oracle中,您还应该在C列上使用直方图,以便为不同的C值设置不同的exec计划。

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

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

答案 1 :(得分:0)

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

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

不确定,但此问题与此question on SO相关。