在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    809

    瀏覽量

    26575
  • null
    +關注

    關注

    0

    文章

    19

    瀏覽量

    3974

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

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

收藏 人收藏

    評論

    相關推薦

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

    效率二極管電力電子和開關電源中扮演著關鍵角色,它們通過提供快速的開關速度和低導通壓降,顯著提升電源系統的效率相同負載條件
    的頭像 發表于 12-23 11:11 ?176次閱讀
    高<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 ?469次閱讀
    什么<b class='flag-5'>情況下</b>IP地址會<b class='flag-5'>相同</b>?

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

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

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

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

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

    電子發燒友網站提供《不犧牲尺寸的情況下提高脈搏血氧儀溶液的性能.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 ?729次閱讀
    為什么電容<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 ?815次閱讀
    GD32斷上電采樣<b class='flag-5'>相同</b>電壓有偏差如何處理?

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

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

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

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

    溫度很低的情況下,電機效率會降低嗎?

    溫度很低的情況下,電機效率會降低嗎? 電機工業和家庭中廣泛應用,其效率是評估其性能的重要指標之一。然而,溫度是影響電機效率的關鍵因素之一。
    的頭像 發表于 01-04 11:26 ?2169次閱讀
    主站蜘蛛池模板: 神马影院午夜dy888| 亚洲一区二区三区在线视频| 日本一区二区三区免费看| 无遮挡一级毛片视频| 欧美日韩免费大片| 4hc44四虎www视频| 1000部禁片黄的免费看| 亚洲美女精品| 国产午夜精品不卡片| 久久semm亚洲国产| 轻点灬大ji巴太粗太长了h| 欧色美| 午夜剧| 亚洲福利视频一区二区三区| 日本特黄a级高清免费酷网| 一级视频免费观看| 黄h视频| 日本黄色免费看| 天天夜夜啦啦啦| 男女交性高清视频无遮挡| 免费在线色| 久久久免费的精品| 亚洲网色| www婷婷| 91在线免费看| 欧美网站视频| 免费观看成人欧美1314www| 最新版天堂资源中文官网| 狠狠干奇米| 欧美性猛交xxxx| 日本人的色道免费网站| 色偷偷尼玛图亚洲综合| 国产a三级三级三级| 国产网站在线播放| 欧美极品xxxxⅹ另类| 日本免费看黄| 久久草在线免费| 四虎影院最新网址| 天天干天天操天天爽| 伊人不卡久久大香线蕉综合影院| 国产二区三区毛片|