博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
count(distinct) 与group by 浅析
阅读量:2053 次
发布时间:2019-04-28

本文共 809 字,大约阅读时间需要 2 分钟。

项目github地址:

欢迎大家star,留言,一起学习进步

x在传统关系型数据库中,group by与count(distinct)都是很常见的操作。count(distinct colA)就是将colA中所有出现过的不同值取出来,相信只要接触过数据库的同学都能明白什么意思。

count(distinct colA)的操作也可以用group by的方式完成,具体代码如下:

select count(distinct colA) from table1;select count(1) from (select colA from table1 group by colA)alias_1;

这两者最后得出的结果是一致的,但是具体的实现方式,有什么不同呢?

上面两种方式本质就是时间与空间的权衡。
distinct需要将colA中的所有内容都加载到内存中,大致可以理解为一个hash结构,key自然就是colA的所有值。因为是hash结构,那运算速度自然就快。最后计算hash中有多少key就是最终的结果。
那么问题来了,在现在的海量数据环境下,需要将所有不同的值都存起来,这个内存消耗,是可想而知的。所以如果数据量特别大,可能会out of memory。。。

group by的实现方式是先将colA排序。排序大家都不陌生,拿最见得快排来说,时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),而空间复杂度只有 O ( 1 ) O(1) O(1)。这样一来,即使数据量再大一些,group by基本也能hold住。但是因为需要做一次 O ( n l o g n ) O(nlogn) O(nlogn) 的排序,时间自然会稍微慢点。。。

总结起来就是,count(distinct)吃内存,查询快;group by空间复杂度小,在时间复杂度允许的情况下,可以发挥他的空间复杂度优势。

转载地址:http://xublf.baihongyu.com/

你可能感兴趣的文章
Intellij IDEA使用(三)——在Intellij IDEA中配置Tomcat服务器
查看>>
Intellij IDEA使用(四)—— 使用Intellij IDEA创建静态的web(HTML)项目
查看>>
Intellij IDEA使用(五)—— Intellij IDEA在使用中的一些其他常用功能或常用配置收集
查看>>
Intellij IDEA使用(六)—— 使用Intellij IDEA创建Java项目并配置jar包
查看>>
Eclipse配置错误 —— Syntax error, annotations are only available if source level is 1.5 or greater
查看>>
Eclipse使用(十)—— 使用Eclipse创建简单的Maven Java项目
查看>>
Eclipse使用(十一)—— 使用Eclipse创建简单的Maven JavaWeb项目
查看>>
Intellij IDEA使用(十三)—— 在Intellij IDEA中配置Maven
查看>>
面试题 —— 关于main方法的十个面试题
查看>>
集成测试(一)—— 使用PHP页面请求Spring项目的Java接口数据
查看>>
使用Maven构建的简单的单模块SSM项目
查看>>
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
Redis学习笔记(四)—— redis的常用命令和五大数据类型的简单使用
查看>>
深入分析JavaWeb技术内幕(一)—— 深入Web请求过程
查看>>
深入分析JavaWeb技术内幕(二)—— 深入分析Java I/O的工作机制
查看>>
使用Java将PDF解析成HTML页面进行展示并从页面中提取Json数据设置到Table中
查看>>
Redis学习笔记(五)—— 在Linux下搭建Redis集群
查看>>
Redis学习笔记(六)—— 解决安装ruby出现的问题:redis requires Ruby version >= 2.2.2.
查看>>
从原理上搞懂编码——究竟什么是编码?什么是解码?什么是字节流?
查看>>
前端上传文件组件Plupload使用指南
查看>>