欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中distinct和group?by去重效率區(qū)別淺析

 更新時間:2023年03月03日 10:04:26   作者:菜鳥小杰子  
distinct 與 group by均可用于去重,下面這篇文章主要給大家介紹了關于MySQL中distinct和group?by去重效率區(qū)別的相關資料,文中介紹的非常詳細,需要的朋友可以參考下

一、distinct

distinct的作用

在mysql中,distinct關鍵字的主要作用就是對數(shù)據(jù)庫表中一個或者多個字段重復的數(shù)據(jù)進行過濾,只返回其中的一條數(shù)據(jù)給用戶,distinct只可以在select中使用

distinct的原理

distinct進行去重的主要原理是通過先對要進行去重的數(shù)據(jù)進行分組操作,然后從分組后的每組數(shù)據(jù)中去一條返回給客戶端,在這個分組的過程可能會出現(xiàn)兩種不同的情況:

distinct 依賴的字段全部包含索引:

該情況mysql直接通過操作索引對滿足條件的數(shù)據(jù)進行分組,然后從分組后的每組數(shù)據(jù)中去一條數(shù)據(jù)。

distinct 依賴的字段未全部包含索引:

該情況由于索引不能滿足整個去重分組的過程,所以需要用到臨時表,mysql首先需要將滿足條件的數(shù)據(jù)放到臨時表中,然后在臨時表中對該部分數(shù)據(jù)進行分組,然后從臨時表中每個分組的數(shù)據(jù)中去一條數(shù)據(jù),在臨時表中進行分組的過程中不會對數(shù)據(jù)進行排序。

distinct的語法:

select distinct expression[,expression…] from tables [where conditions];

在使用distinct的過程中主要注意一下幾點:

在對字段進行去重的時候,要保證distinct在所有字段的最前面

如果distinct關鍵字后面有多個字段時,則會對多個字段進行組合去重,只有多個字段組合起來的值是相等的才會被去重

二、group by

groupby在Mysql8.0之前會進行隱式排序,導致觸發(fā)filesort,sql執(zhí)行效率低下,Mysql8.0開始,Mysql就刪除了隱式排序

隱式排序

對于隱式排序,我們可以參考Mysql官方的解釋:

MySQL :: MySQL 5.7 Reference Manual :: 8.2.1.14 ORDER BY Optimization

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 指示符的情況下也會進行排序)。然而,GROUPBY進行顯式或隱式排序已經(jīng)過時(deprecated)了,要生成給定的排序順序,請?zhí)峁?ORDER BY 子句。

所以,在Mysql8.0之前,Group by會默認根據(jù)作用字段(Groupby的后接字段)對結(jié)果進行排序。在能利用索引的情況下,Group by不需要額外進行排序操作;但當無法利用索引排序時,Mysql優(yōu)化器就不得不選擇通過使用臨時表然后再排序的方式來實現(xiàn)GROUPBY了。且當結(jié)果集的大小超出系統(tǒng)設置臨時表大小時,Mysql會將臨時表數(shù)據(jù)copy到磁盤上面再進行操作,語句的執(zhí)行效率會變得極低。這也是Mysql選擇將此操作(隱式排序)棄用的原因。

基于上述原因,Mysql在8.0時,對此進行了優(yōu)化更新:

MySQL :: MySQL 8.0 Reference Manual :: 8.2.1.16 ORDER BY Optimization

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 claus

大致解釋一下:

從前(Mysql5.7版本之前),Group by會根據(jù)確定的條件進行隱式排序。在mysql 8.0中,已經(jīng)移除了這個功能,所以不再需要通過添加order by null 來禁止隱式排序了,但是,查詢結(jié)果可能與以前的 MySQL 版本不同。要生成給定順序的結(jié)果,請按通過ORDER BY指定需要進行排序的字段。

三、distinct 和 group by 比較

在語義相同,有索引的情況下:

group by和distinct都能使用索引,效率相同。因為groupby和distinct近乎等價,distinct可以被看做是特殊的group by。

在語義相同,無索引的情況下:

distinct效率高于group by。原因是distinct 和 group by都會進行分組操作,但group
by在Mysql8.0之前會進行隱式排序,導致觸發(fā)filesort,sql執(zhí)行效率低下。
但從Mysql8.0開始,Mysql就刪除了隱式排序,所以,此時在語義相同,無索引的情況下,groupby和distinct的執(zhí)行效率也是近乎等價的。

推薦group by的原因:

group by語義更為清晰 group by可對數(shù)據(jù)進行更為復雜的一些處理 相比于distinct來說,group by的語義明確。且由于distinct關鍵字會對所有字段生效,在進行復合業(yè)務處理時,group by的使用靈活性更高,groupby能根據(jù)分組情況,對數(shù)據(jù)進行更為復雜的處理,例如通過having對數(shù)據(jù)進行過濾,或通過聚合函數(shù)對數(shù)據(jù)進行運算。

distinct 主要是對數(shù)據(jù)兩兩進行比較,需要遍歷整個表

group by 是在查詢時先把數(shù)據(jù)按照分組字段分組出來再查詢,當數(shù)據(jù)量較大時,group by 速度要優(yōu)于 distinct

總結(jié)

到此這篇關于MySQL中distinct和group by去重效率區(qū)別的文章就介紹到這了,更多相關MySQL distinct和group by去重效率內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mysql 多個字段拼接的實例詳解

    mysql 多個字段拼接的實例詳解

    這篇文章主要介紹了mysql 多個字段拼接的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 阿里云安裝mysql數(shù)據(jù)庫出現(xiàn)2002錯誤解決辦法

    阿里云安裝mysql數(shù)據(jù)庫出現(xiàn)2002錯誤解決辦法

    這篇文章主要介紹了阿里云安裝mysql數(shù)據(jù)庫出現(xiàn)2002錯誤解決辦法,需要的朋友可以參考下
    2017-04-04
  • CentOS6.5下RPM方式安裝mysql5.6.33的詳細教程

    CentOS6.5下RPM方式安裝mysql5.6.33的詳細教程

    本文給大家詳細介紹CentOS6.5下RPM方式安裝mysql5.6.33的教程,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友一起看看吧
    2016-10-10
  • MySql實現(xiàn)分布式鎖的示例代碼

    MySql實現(xiàn)分布式鎖的示例代碼

    本文主要介紹了使用MySQL實現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • 在linux中導入sql文件的方法分享(使用命令行轉(zhuǎn)移mysql數(shù)據(jù)庫)

    在linux中導入sql文件的方法分享(使用命令行轉(zhuǎn)移mysql數(shù)據(jù)庫)

    為使用阿里云主機,沒有裝ftp,也沒有裝phpmyadmin,所以一切都得靠命令行。轉(zhuǎn)移網(wǎng)站的重要一步就是轉(zhuǎn)移數(shù)據(jù)庫,這里簡單介紹一下如何在這種情況下導入sql文件
    2014-02-02
  • Mysql閃退問題圖文解決辦法

    Mysql閃退問題圖文解決辦法

    之前在使用MySQL 5.5 Command Line Client時,無論輸入什么密碼,都出現(xiàn)閃退的情況,糾結(jié)了半天才找到原因,下面小編給大家分享我的解決方法,感興趣的朋友一起看看吧
    2016-11-11
  • 分享101個MySQL調(diào)試與優(yōu)化技巧

    分享101個MySQL調(diào)試與優(yōu)化技巧

    隨著越來越多的數(shù)據(jù)庫驅(qū)動的應用程序,人們一直在推動MySQL發(fā)展到它的極限。這里是101條調(diào)節(jié)和優(yōu)化MySQL安裝的技巧。一些技巧是針對特定的安裝環(huán)境的,但這些思路是通用的。我已經(jīng)把他們分成幾類,來幫助你掌握更多MySQL的調(diào)節(jié)和優(yōu)化技巧
    2017-05-05
  • Scott?數(shù)據(jù)?映射?MySQL代碼實現(xiàn)分享

    Scott?數(shù)據(jù)?映射?MySQL代碼實現(xiàn)分享

    這篇文章主要介紹了Scott?數(shù)據(jù)?映射?MySQL,文章圍繞Scott?數(shù)據(jù)?映射?MySQL的相關代碼分享給大家,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-02-02
  • MySQL是如何實現(xiàn)主備同步

    MySQL是如何實現(xiàn)主備同步

    這篇文章主要介紹了MySQL是如何實現(xiàn)主備同步的,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-12-12
  • Mysql存儲二進制對象數(shù)據(jù)問題

    Mysql存儲二進制對象數(shù)據(jù)問題

    這篇文章主要介紹了Mysql存儲二進制對象數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論