色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么在語義相同的情況下group by和distinct效率相同呢?

jf_ro2CN3Fa ? 來源:CSDN ? 2023-01-09 10:46 ? 次閱讀

結論

先說大致的結論:

在語義相同,有索引的情況下:group by和distinct都能使用索引,效率相同。

在語義相同,無索引的情況下:distinct效率高于group by。原因是distinct 和 group by都會進行分組操作,但group by可能會進行排序,觸發filesort,導致sql執行效率低下。

基于這個結論,你可能會問:

為什么在語義相同,有索引的情況下,group by和distinct效率相同?

在什么情況下,group by會進行排序操作?

帶著這兩個問題找答案。接下來,我們先來看一下distinct和group by的基礎使用。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

distinct的使用

distinct用法

SELECTDISTINCTcolumnsFROMtable_nameWHEREwhere_conditions;

例如:

mysql>selectdistinctagefromstudent;
+------+
|age|
+------+
|10|
|12|
|11|
|NULL|
+------+
4rowsinset(0.01sec)

DISTINCT 關鍵詞用于返回唯一不同的值。放在查詢語句中的第一個字段前使用,且作用于主句所有列。

如果列具有NULL值,并且對該列使用DISTINCT子句,MySQL將保留一個NULL值,并刪除其它的NULL值,因為DISTINCT子句將所有NULL值視為相同的值。

distinct多列去重

distinct多列的去重,則是根據指定的去重的列信息來進行,即只有所有指定的列信息都相同,才會被認為是重復的信息。

SELECTDISTINCTcolumn1,column2FROMtable_nameWHEREwhere_conditions;
mysql>selectdistinctsex,agefromstudent;
+--------+------+
|sex|age|
+--------+------+
|male|10|
|female|12|
|male|11|
|male|NULL|
|female|11|
+--------+------+
5rowsinset(0.02sec)

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

group by的使用

對于基礎去重來說,group by的使用和distinct類似:

單列去重

語法:

SELECTcolumnsFROMtable_nameWHEREwhere_conditionsGROUPBYcolumns;

執行:

mysql>selectagefromstudentgroupbyage;
+------+
|age|
+------+
|10|
|12|
|11|
|NULL|
+------+
4rowsinset(0.02sec)

多列去重

語法:

SELECTcolumnsFROMtable_nameWHEREwhere_conditionsGROUPBYcolumns;

執行:

mysql>selectsex,agefromstudentgroupbysex,age;
+--------+------+
|sex|age|
+--------+------+
|male|10|
|female|12|
|male|11|
|male|NULL|
|female|11|
+--------+------+
5rowsinset(0.03sec)

區別示例

兩者的語法區別在于,group by可以進行單列去重,group by的原理是先對結果進行分組排序,然后返回每組中的第一條數據。且是根據group by的后接字段進行去重的。

例如:

mysql>selectsex,agefromstudentgroupbysex;
+--------+-----+
|sex|age|
+--------+-----+
|male|10|
|female|12|
+--------+-----+
2rowsinset(0.03sec)

distinct和group by原理

在大多數例子中,DISTINCT可以被看作是特殊的GROUP BY,它們的實現都基于分組操作,且都可以通過松散索引掃描、緊湊索引掃描(關于索引掃描的內容會在其他文章中詳細介紹,就不在此細致介紹了)來實現。

DISTINCT和GROUP BY都是可以使用索引進行掃描搜索的。例如以下兩條sql(只單單看表格最后extra的內容),我們對這兩條sql進行分析,可以看到,在extra中,這兩條sql都使用了緊湊索引掃描Using index for group-by。

所以,在一般情況下,對于相同語義的DISTINCT和GROUP BY語句,我們可以對其使用相同的索引優化手段來進行優化。

mysql>explainselectint1_indexfromtest_distinct_groupbygroupbyint1_index;
+----+-------------+-----------------------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
+----+-------------+-----------------------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
|1|SIMPLE|test_distinct_groupby|NULL|range|index_1|index_1|5|NULL|955|100.00|Usingindexforgroup-by|
+----+-------------+-----------------------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
1rowinset(0.05sec)

mysql>explainselectdistinctint1_indexfromtest_distinct_groupby;
+----+-------------+-----------------------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
+----+-------------+-----------------------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
|1|SIMPLE|test_distinct_groupby|NULL|range|index_1|index_1|5|NULL|955|100.00|Usingindexforgroup-by|
+----+-------------+-----------------------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
1rowinset(0.05sec)

但對于GROUP BY來說,在MYSQL8.0之前,GROUP Y默認會依據字段進行隱式排序。

可以看到,下面這條sql語句在使用了臨時表的同時,還進行了filesort。

mysql>explainselectint6_bigger_randomfromtest_distinct_groupbyGROUPBYint6_bigger_random;
+----+-------------+-----------------------+------------+------+---------------+------+---------+------+-------+----------+---------------------------------+
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
+----+-------------+-----------------------+------------+------+---------------+------+---------+------+-------+----------+---------------------------------+
|1|SIMPLE|test_distinct_groupby|NULL|ALL|NULL|NULL|NULL|NULL|97402|100.00|Usingtemporary;Usingfilesort|
+----+-------------+-----------------------+------------+------+---------------+------+---------+------+-------+----------+---------------------------------+
1rowinset(0.04sec)

隱式排序

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

大致解釋一下:

GROUP BY 默認隱式排序(指在 GROUP BY 列沒有 ASC 或 DESC 指示符的情況下也會進行排序)。然而,GROUP BY進行顯式或隱式排序已經過時(deprecated)了,要生成給定的排序順序,請提供 ORDER BY 子句。

所以,在Mysql8.0之前,Group by會默認根據作用字段(Group by的后接字段)對結果進行排序。在能利用索引的情況下,Group by不需要額外進行排序操作;但當無法利用索引排序時,Mysql優化器就不得不選擇通過使用臨時表然后再排序的方式來實現GROUP BY了。

且當結果集的大小超出系統設置臨時表大小時,Mysql會將臨時表數據copy到磁盤上面再進行操作,語句的執行效率會變得極低。這也是Mysql選擇將此操作(隱式排序)棄用的原因。

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

大致解釋一下:

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

因此,我們的結論也出來了:

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

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

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

distinct效率高于group by。原因是distinct 和 group by都會進行分組操作,但group by在Mysql8.0之前會進行隱式排序,導致觸發filesort,sql執行效率低下。

但從Mysql8.0開始,Mysql就刪除了隱式排序,所以,此時在語義相同,無索引的情況下,group by和distinct的執行效率也是近乎等價的。

推薦group by的原因

group by語義更為清晰

group by可對數據進行更為復雜的一些處理

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






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • MySQL
    +關注

    關注

    1

    文章

    816

    瀏覽量

    26613
  • null
    +關注

    關注

    0

    文章

    19

    瀏覽量

    3985

原文標題:面試官:MySQL中的 distinct 和 group by 哪個效率更高?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    效率二極管相同負載,出現不同反向恢復時間的原因

    效率二極管電力電子和開關電源中扮演著關鍵角色,它們通過提供快速的開關速度和低導通壓降,顯著提升電源系統的效率相同負載條件
    的頭像 發表于 12-23 11:11 ?236次閱讀
    高<b class='flag-5'>效率</b>二極管<b class='flag-5'>在</b><b class='flag-5'>相同</b>負載<b class='flag-5'>下</b>,出現不同反向恢復時間的原因

    使用SN65hvd50進行數據通信,待機空閑的情況下溫升有10℃以上,為什么?

    最近在使用SN65hvd50進行數據通信,發現這個片子待機空閑的情況下溫升有10℃以上,是沒有外接連線,沒有任何匹配電阻的情況下,R和D測試均為低電平!如果在通信條件
    發表于 12-20 10:29

    為什么噪聲功率低采樣率和過采樣率的情況下相同

    請教一,為什么噪聲功率低采樣率和過采樣率的情況下相同? 假設是相同的,我覺得低采樣率
    發表于 12-13 08:08

    什么情況下IP地址會相同

    通過同一臺路由器上網的設備,IP地址會相同我們自己家里或者是公司,如果很多臺設備連接的是同一臺路由器,我們的手機/平板等設備局域網內一般都會分配不同的私有IP地址,但如果從外部
    的頭像 發表于 11-19 11:20 ?541次閱讀
    什么<b class='flag-5'>情況下</b>IP地址會<b class='flag-5'>相同</b>?

    谷景科普相同電感量的電感外形不同可以互換嗎

    之一,對電感的使用有著直接影響。實際應用中,兩個感量相同的電感,但它們的外形不一定相同的,那么,它們是否可以互換?我們知道,電感的外觀設計會對它的性能參數和安裝方式產生影響。但感量
    發表于 11-13 22:41 ?0次下載

    一文看懂大功率電感感值相同封裝規格就相同

    一文看懂大功率電感感值相同封裝規格就相同嗎 編輯:谷景電子 大部分電感器件中,大功率電感占據了一個比較高的地位。它們不僅應用廣泛,而且很多電子產品的電路中扮演著重要的角色。圍繞大功
    的頭像 發表于 10-23 17:44 ?212次閱讀

    不犧牲尺寸的情況下提高脈搏血氧儀溶液的性能

    電子發燒友網站提供《不犧牲尺寸的情況下提高脈搏血氧儀溶液的性能.pdf》資料免費下載
    發表于 09-21 10:54 ?0次下載
    <b class='flag-5'>在</b>不犧牲尺寸的<b class='flag-5'>情況下</b>提高脈搏血氧儀溶液的性能

    運放使用時,虛短,虛斷什么情況下使用

    運放使用時,虛短,虛斷什么情況下使用?是單端,差分輸入條件都能使用么?
    發表于 09-14 08:53

    不影響性能或占用空間的情況下隔離您的CAN系統

    電子發燒友網站提供《不影響性能或占用空間的情況下隔離您的CAN系統.pdf》資料免費下載
    發表于 08-29 10:49 ?0次下載
    <b class='flag-5'>在</b>不影響性能或占用空間的<b class='flag-5'>情況下</b>隔離您的CAN系統

    為什么電容低電壓情況下會發熱

    本身存在內阻,低電壓會導致電流增加,如果內阻相對較大,電容器內部的能量損耗增加,也會導致發熱。 3、老化或劣化 :電容器長期使用后,可能會因為絕緣材料老化、劣化等原因增加介質損耗,即使低電壓情況下,損耗功率依然較
    的頭像 發表于 08-26 14:04 ?759次閱讀
    為什么電容<b class='flag-5'>在</b>低電壓<b class='flag-5'>情況下</b>會發熱

    條件相同情況下,stm8L與STM32L誰的功耗會更低?

    stm8L與STM32L誰的功耗會更低,條件相同情況下,正常運行和低功耗模式時。
    發表于 04-16 07:17

    GD32斷上電采樣相同電壓有偏差如何處理?

    大家是否碰到過使用GD32 MCU斷上電采樣相同的電壓存在偏差的情況?如果在上電正常運行的情況下,采樣相同的直流電壓,ADC采樣數值都比較穩定,而斷上電重新運行的時候采樣
    的頭像 發表于 02-29 09:44 ?823次閱讀
    GD32斷上電采樣<b class='flag-5'>相同</b>電壓有偏差如何處理?

    什么情況下電容器會被擊穿

    電容器是一種常見的電子元件,廣泛應用于各個領域。然而,特定條件,電容器可能會發生擊穿現象,導致其無法正常工作甚至損壞。那么,什么情況下電容器會被擊穿
    的頭像 發表于 02-19 14:11 ?2785次閱讀

    無功補償什么情況下需要增設電容補償

    無功補償引發的電能損耗是很多用戶需要解決的問題之一。某些情況下,為了降低無功功率的影響,需要增設電容補償。
    的頭像 發表于 01-18 14:18 ?1019次閱讀

    ADU7023的EEPROM什么情況下會被改寫?

    ADU7023的EEPROM什么情況下會被改寫?知道電源噪聲特定頻率超過一定幅度會發生這種情況,排除電源噪聲因素,還可能有什么原因
    發表于 01-11 06:17
    主站蜘蛛池模板: 黄色天堂在线| 99热这里只有 精品| 成人免费视频在线播放| 日本护士在线观看| 国产成人小视频| 亚欧洲乱码视频一二三区| 精品免费久久久久久影院| 9420高清免费观看在线大全| 青春禁区动漫免费观看| 国产中文视频| 午夜黄视频| 久久这里只有精品1| 白白操在线视频| 亚洲免费一区二区| 欧美 亚洲 有码中文字幕| 国产精品美女久久久久AV超清| 在线观看免费视频播放视频| 日本xxxxxx片免费播放18| 激情丛林电影完整在线| 爱穿丝袜的麻麻3d漫画acg| 亚洲欧洲自拍偷拍| 人人草人人草| 久久久久国产| 国产精品无码AV天天爽色欲 | 日韩一区二区三区精品| 九色PORNY丨视频入口| 大桥未久电影在线观看| 越南女 黑人 痛苦 大叫| 四川少妇大战4黑人| 国产精品视频免费观看| 中文字幕不卡在线高清| 四虎影5151毛片在线看| 老师的玉足高跟鞋满足我| 国产成人无码WWW免费视频在线| 18禁黄无遮挡禁游戏在线下载| 免费精品在线视频| 国产午夜精品理论片免费观看 | 亚洲日韩在线天堂一| 青娱国产区在线| 久久久久久久久久毛片精品美女 | 玩弄人妻少妇500系列网址|