count(distinct)与groupby浅析
x在传统关系型数据库中,group by与count(distinct)都是很常见的操作。count(distinct colA)就是将colA中所有出现过的不同值取出来,相信只要接触过数据库的同学都能明⽩什么意思。
幸福的甜蜜count(distinct colA)的操作也可以⽤group by的⽅式完成,具体代码如下:
洗碗的过程
lect count(distinct colA) from table1;
lect count(1) from (lect colA from table1 group by colA) alias_1;
这两者最后得出的结果是⼀致的,但是具体的实现⽅式,有什么不同呢?各种各样英语
行星撞地球上⾯两种⽅式本质就是时间与空间的权衡。
distinct需要将colA中的所有内容都加载到内存中,⼤致可以理解为⼀个hash结构,key⾃然就是colA的所有值。因为是hash结构,那运算速度⾃然就快。最后计算hash中有多少key就是最终的结果。
那么问题来了,在现在的海量数据环境下,需要将所有不同的值都存起来,这个内存消耗,是可想⽽知的。所以如果数据量特别⼤,可能会out of memory。。。
group by的实现⽅式是先将colA排序。排序⼤家都不陌⽣,拿最见得快排来说,时间复杂度为
,⽽空间复杂度只有
未婚夫妇清算报告。这样⼀来,即使数据量再⼤⼀些,group by基本也能hold住。但是因为需要做⼀次
妄的拼音的排序,时间⾃然会稍微慢点。。。无法连接到相机
总结起来就是,count(distinct)吃内存,查询快;group by空间复杂度⼩,在时间复杂度允许的情况下,可以发挥他的空间复杂度优势。