今天在使用sql的查询所有关键字时候用到了group by,因为数据量比较大执行时间比较久所以又想到了distinct,想知道二者的区别是什么,哪个更快一些,于是我找度娘学习了一下
结论
- distinct需要把列中的全部内容都存储在一个内存中,可以理解为一个hash结构,key为列的值,最后计算hash结构中有多少个key很明显,缺点:需要把所有不同的值都存起来,内存消耗可能较大。
- 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子句。