最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、distinct

distinct的作用

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

distinct的原理

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

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

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

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

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

distinct的語(yǔ)法:

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

在使用distinct的過程中主要注意一下幾點(diǎn):

在對(duì)字段進(jìn)行去重的時(shí)候,要保證distinct在所有字段的最前面

如果distinct關(guān)鍵字后面有多個(gè)字段時(shí),則會(huì)對(duì)多個(gè)字段進(jìn)行組合去重,只有多個(gè)字段組合起來的值是相等的才會(huì)被去重

二、group by

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

隱式排序

對(duì)于隱式排序,我們可以參考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 默認(rèn)隱式排序(指在 GROUP BY 列沒有 ASC 或 DESC 指示符的情況下也會(huì)進(jìn)行排序)。然而,GROUPBY進(jìn)行顯式或隱式排序已經(jīng)過時(shí)(deprecated)了,要生成給定的排序順序,請(qǐng)?zhí)峁?ORDER BY 子句。

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

基于上述原因,Mysql在8.0時(shí),對(duì)此進(jìn)行了優(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會(huì)根據(jù)確定的條件進(jìn)行隱式排序。在mysql 8.0中,已經(jīng)移除了這個(gè)功能,所以不再需要通過添加order by null 來禁止隱式排序了,但是,查詢結(jié)果可能與以前的 MySQL 版本不同。要生成給定順序的結(jié)果,請(qǐng)按通過ORDER BY指定需要進(jìn)行排序的字段。

三、distinct 和 group by 比較

在語(yǔ)義相同,有索引的情況下:

group by和distinct都能使用索引,效率相同。因?yàn)間roupby和distinct近乎等價(jià),distinct可以被看做是特殊的group by。

在語(yǔ)義相同,無索引的情況下:

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

推薦group by的原因:

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

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

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

總結(jié)

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

相關(guān)文章

  • MySQL表分區(qū)的幾種實(shí)現(xiàn)

    MySQL表分區(qū)的幾種實(shí)現(xiàn)

    本文主要介紹了MySQL表分區(qū)的幾種實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • MySQL MHA 高可用集群搭建過程詳解

    MySQL MHA 高可用集群搭建過程詳解

    MHA 是一套優(yōu)秀的、開源的 MySQL 高可用性解決方案,它的核心目標(biāo)是在 MySQL 主從復(fù)制環(huán)境中,實(shí)現(xiàn)主庫(kù)故障時(shí)的自動(dòng)故障轉(zhuǎn)移和快速切換,盡可能保證數(shù)據(jù)庫(kù)服務(wù)的連續(xù)性,這篇文章主要介紹了MySQL MHA 高可用集群搭建指南,需要的朋友可以參考下
    2025-10-10
  • mysql 8.0.18 安裝配置方法圖文教程

    mysql 8.0.18 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.18 安裝配置方法圖文教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • MySQL 查詢過濾之WHERE 子句與運(yùn)算符實(shí)戰(zhàn)技巧

    MySQL 查詢過濾之WHERE 子句與運(yùn)算符實(shí)戰(zhàn)技巧

    本文將系統(tǒng)講解WHERE子句的用法及常用運(yùn)算符(算術(shù)、比較)的規(guī)則與實(shí)戰(zhàn)技巧,幫你掌握數(shù)據(jù)篩選的精髓,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • MYSQL?增加從庫(kù)方式介紹

    MYSQL?增加從庫(kù)方式介紹

    這篇文章主要介紹了MYSQL?增加從庫(kù)方式介紹,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-08-08
  • MySQL高級(jí)查詢語(yǔ)法分析

    MySQL高級(jí)查詢語(yǔ)法分析

    在面試過程中經(jīng)常會(huì)遇到sq查詢問題,今天小編通過本文給大家介紹下MySQL高級(jí)查詢語(yǔ)法分析,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • mysql 5.7.18 winx64 免安裝 配置方法

    mysql 5.7.18 winx64 免安裝 配置方法

    這篇文章主要介紹了mysql 5.7.18 winx64 免安裝配置方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-04-04
  • MySQL子查詢中order by不生效問題的解決方法

    MySQL子查詢中order by不生效問題的解決方法

    ORDER BY 語(yǔ)句用于根據(jù)指定的列對(duì)結(jié)果集進(jìn)行排序,在日常工作中經(jīng)常會(huì)用到,這篇文章主要給大家介紹了關(guān)于MySQL子查詢中order by不生效問題的解決方法,需要的朋友可以參考下
    2021-07-07
  • Mysql中批量替換某個(gè)字段的部分?jǐn)?shù)據(jù)(推薦)

    Mysql中批量替換某個(gè)字段的部分?jǐn)?shù)據(jù)(推薦)

    這篇文章主要介紹了Mysql中批量替換某個(gè)字段的部分?jǐn)?shù)據(jù),通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • zabbix監(jiān)控MySQL主從狀態(tài)的方法詳解

    zabbix監(jiān)控MySQL主從狀態(tài)的方法詳解

    這篇文章主要介紹了zabbix--監(jiān)控MySQL主從狀態(tài)的方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-06-06

最新評(píng)論

柏乡县| 陈巴尔虎旗| 滨海县| 肇庆市| 宜兴市| 耒阳市| 高雄县| 广平县| 桑日县| 陵水| 尉氏县| 苍梧县| 商洛市| 平湖市| 利辛县| 永川市| 德令哈市| 洪雅县| 泸西县| 体育| 乐东| 崇州市| 江油市| 新干县| 南昌市| 伊春市| 双鸭山市| 五家渠市| 新绛县| 卢龙县| 泾阳县| 保山市| 得荣县| 武安市| 克东县| 金昌市| 岢岚县| 韶关市| 灵丘县| 桐柏县| 林周县|