美文网首页
mysql中distinct的学习

mysql中distinct的学习

作者: 点点寒彬 | 来源:发表于2020-01-12 21:47 被阅读0次

背景

今年给自己定下的基调就是要好好学一下数据库相关的知识,所以今天也开始弃用各类ORM框架,使用原生的sql来干一些活。这次遇到的问题就是一个去重查询的问题。

过程

去重查询,我第一个想到的就是group by。这个方法是可以去重的。

SELECT count(tag_id) FROM xx.xx GROUP BY tag_id;

结果看到的数据是每一个不同的tag_id的计数。类似下面这样的数据:

count(tag_id)
1
1
1
1
4
1
6

这样的数据显然不是我需要的,我要的数据是统计不同类型的tag_id有多少个,而不是每种tag_id有多少条记录。

经过搜索发现,distinct能满足我的要求。上面的sql改为:

SELECT count(distinct tag_id) FROM xx.xx GROUP BY tag_id;

这样的查询结果就是我想要的。

后续

问题虽然是解决了,但是抱着学习的心态,看了一下distinct相关的内容。

distinct翻译过来就是 不同的 类似的意思。

我是把它跟聚合函数count放在一起使用了,如果单独使用,其实就是去重的结果。

如果不使用count来统计总数,直接使用distinct,这个结果与group by都是去重的记录。区别就是排序不一样。group by会执行排序,而distinct不会执行排序。

如果查询的结果带上limit子句的话,distinctgroup by都会返回对应的limit数量,不过group by的结果也是排序后的结果。

性能

distinctgroup by功能类似。我查了一下资料。

DISTINCT:这种方式会将全部内容存储在一个hash结构里,最后通过计算hash结构中key的个数即可得到结果,典型的以空间换取时间的方式。
GROUP BY:这种方式是先将字段排序(一般使用sort),然后进行计数,典型的以时间换取空间。

根据这个说法,数据离散程度越大,用group by的方式就更高效,反之则是distinct更高效。

相关文章

网友评论

      本文标题:mysql中distinct的学习

      本文链接:https://www.haomeiwen.com/subject/gimwactx.html