group by和distinct区别详解

今天在使用sql的查询所有关键字时候用到了group by,因为数据量比较大执行时间比较久所以又想到了distinct,想知道二者的区别是什么,哪个更快一些,于是我找度娘学习了一下

结论
  1. distinct需要把列中的全部内容都存储在一个内存中,可以理解为一个hash结构,key为列的值,最后计算hash结构中有多少个key很明显,缺点:需要把所有不同的值都存起来,内存消耗可能较大。
  2. group by的方式是先按照列排序。而数据库中的group一般使用sort的方法,即数据库会先对列进行排序。而排序的基本理论中时间复杂为nlogn,空间为1.,然后只要单纯的计数就可以了。优点是空间复杂度小,缺点是要进行一次排序,执行时间会较长。
    在这里插入图片描述
附加

在MYSQL8.0之前,group by默认会依据字段进行隐式排序

“ GROUP BY implicitly sorts by default (that is, in the absence of ASC or DESC designators for GROUP BY columns). However, relying on implicit GROUP BY sorting (that is, sorting in the absence of ASC or DESC designators) or explicit sorting for GROUP BY (that is, by using explicit ASC or DESC designators for GROUP BY columns) is deprecated. To produce a given sort order, provide an ORDER BY clause.

默认情况下,GROUP BY隐式排序(即,如果GROUP BY列没有ASC或DESC指示符)。但是,不推荐使用隐式GROUP BY排序(即在缺少ASC或DESC指示符的情况下进行排序)或GROUP BY的显式排序(即对GROUP BY列使用显式ASC或DESS指示符)。要生成给定的排序顺序,请提供ORDERBY子句。

Mysql在8.0时,对此进行了优化更新

“ Previously (MySQL 5.7 and lower), GROUP BY sorted implicitly under certain conditions. In MySQL 8.0, that no longer occurs, so specifying ORDER BY NULL at the end to suppress implicit sorting (as was done previously) is no longer necessary. However, query results may differ from previous MySQL versions. To produce a given sort order, provide an ORDER BY clause.

以前(MySQL 5.7及更低版本),GROUP BY在某些条件下隐式排序。在MySQL 8.0中,这种情况不再发生,因此在末尾指定ORDER BY NULL以禁止隐式排序(如前所述)不再是必要的。但是,查询结果可能与以前的MySQL版本不同。要生成给定的排序顺序,请提供ORDERBY子句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值