数据库操作中,去重计数有两种实现方式,一种是 count + distinct 一种是 count + group by
id | salary |
1 | 10K |
2 | 15K |
3 | 10K |
4 | 10K |
5 | 20K |
6 | 10K |
7 | 15K |
假设有以上这么个表,要对salary去重计数,按照上面的思路有两种实现方法:
1.
select distinct(count(salary)) from table
2.
select count(salary) from table group by salary
那么这两种方法有什么不同?都是出于什么样的考虑呢?
- distinct 需要将所有的salary值存到一块内存当中去,相当于一个hash结构,key是salary的值,然后最后计算hash的个数;
- group by 先将salary进行一次sort排序,时间复杂度为nlogn,空间复杂度为1;
数据分布 | 去重方式 | 原因 |
离散(多表) | group by | 发挥空间复杂度的优势,但是花费时间长一些 |
集中 | distinct | distinct占用空间较小,发挥时间复杂度的优势 |
极端情况考虑:
- 如果数据全部重复,用distinct又快又好;
- 如果数据全部唯一,用group by;