mysql,sql server,oracle和其他函数中count,sum,avg或任何其他内置“math”函数的函数的时间复杂度是多少?
有人会认为调用sum(myColumn)是线性的。
但是计数(1)不是。怎么样,真正的时间复杂性是什么?
在一个完美的世界里,我希望sum,avg和count为O(1)。但我们不住在其中一个,是吗?
答案 0 :(得分:4)
mysql,sql server,oracle和其他函数中count,sum,avg或任何其他内置“math”函数的函数的时间复杂度是多少?
在MySQL
MyISAM
COUNT(*)
GROUP BY
O(1)
MAX
({1}}
它存储在表格元数据中。
在所有系统中,MIN
和GROUP BY
在没有O(log(n))
的索引表达式上为O(n)
(对数)。
使用单个索引搜索获取它们。
汇总函数为GROUP BY
(线性),未使用GROUP BY
或HASH
时使用O(n log(n))
GROUP BY
使用SORT
时,汇总函数为SORT
。
所有值都应该被提取,计算并存储在状态变量中(可以存储在哈希表中)。
此外,使用{{1}}时,也应对其进行排序。
答案 1 :(得分:3)
在SQL中,聚合的数学函数复杂性完全无关紧要。唯一真正重要的是数据加入的复杂性:选择哪种访问路径(表扫描,索引范围扫描,索引搜索等)以及读取的页数。每个聚合的内部可能略有不同,但它们的工作方式几乎相同(保持运行状态并计算每个输入值的运行聚合),并且绝对存在 NO 聚合输入两次,所以它们都是O(n)作为内部实现,其中'n'是输入到聚合的记录数(不一定是表中记录的数量!)。
某些聚合具有内部快捷方式,例如。如果可能,COUNT(*)可以从某些系统的元数据返回计数。
答案 2 :(得分:1)
注意:这是基于我对SQL查询规划器如何工作的理解的推测,并且可能不完全准确。
我相信所有聚合函数,或者至少你在上面命名的“数学”函数应该是O(n)。查询将大致如下执行:
但请注意,即使聚合函数为O(n),操作也可能不是。如果您创建一个笛卡儿将表连接到自身的查询,您将看到O(n * n)最小值只是为了创建初始行集(步骤#1)。排序以创建行组(步骤#2)可能是O(n lg n),并且可能需要磁盘存储来进行排序操作(与内存操作相反),因此如果您是查询,则查询可能仍然表现不佳操纵很多行。
答案 3 :(得分:0)
对于大数据仓库样式的查询,主要数据库可以并行化任务,因此有多个CPU在其上工作。因此,在协调并行线程的成本与使用多个CPU的好处之间存在不一致的阈值点。