女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

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

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

結(jié)論

先說大致的結(jié)論:

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

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

基于這個結(jié)論,你可能會問:

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

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

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

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

distinct的使用

distinct用法

SELECTDISTINCTcolumnsFROMtable_nameWHEREwhere_conditions;

例如:

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

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

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

distinct多列去重

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

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 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

group by的使用

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

單列去重

語法:

SELECTcolumnsFROMtable_nameWHEREwhere_conditionsGROUPBYcolumns;

執(zhí)行:

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

多列去重

語法:

SELECTcolumnsFROMtable_nameWHEREwhere_conditionsGROUPBYcolumns;

執(zhí)行:

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

區(qū)別示例

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

例如:

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

distinct和group by原理

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

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

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

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默認會依據(jù)字段進行隱式排序。

可以看到,下面這條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進行顯式或隱式排序已經(jīng)過時(deprecated)了,要生成給定的排序順序,請?zhí)峁?ORDER BY 子句。

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

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

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

大致解釋一下:

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

因此,我們的結(jié)論也出來了:

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

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

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

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

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

推薦group by的原因

group by語義更為清晰

group by可對數(shù)據(jù)進行更為復(fù)雜的一些處理

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






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    849

    瀏覽量

    27559
  • null
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    4089

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

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

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    使用ADS1675REF開發(fā)板,adcpro相同的配置的情況下指標差距好大,請問為什么?

    使用ADS1675REF開發(fā)板,具體如下:adcpro相同的配置的情況下。 我給開發(fā)板供電9V,-4V,5V,共3種電源,輸入單頻點模擬信號100k,功率0dBm,采集后,顯示主信號
    發(fā)表于 01-10 06:30

    效率二極管相同負載,出現(xiàn)不同反向恢復(fù)時間的原因

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

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

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

    VDD1沒有供電的情況下,VDD2正常供電的情況下,AMC1200的輸出應(yīng)該是什么狀態(tài)?

    請教一,在前端VDD1沒有供電的情況下,VDD2正常供電的情況下,AMC1200的輸出狀態(tài)為什么P端是3.8V ,N端是1.2V ,每一次都是這樣子, 請問,VDD1沒有供電的
    發(fā)表于 12-17 07:37

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

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

    什么情況下IP地址會相同?

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

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

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

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

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

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

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

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

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

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

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

    電容和二極管串聯(lián)二極管電壓相同

    電容和二極管串聯(lián)的電路中,二極管兩端的電壓并不總是與電容兩端的電壓相同,這取決于電路的具體工作狀態(tài)和電源的類型(直流或交流)。 直流電源情況 直流電源
    的頭像 發(fā)表于 08-27 09:33 ?1436次閱讀

    為什么電容低電壓情況下會發(fā)熱

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

    什么情況下會產(chǎn)生零序電流

    零序電流是指在三相電力系統(tǒng)中,三相電流的矢量和不為零的情況。正常情況下,三相電力系統(tǒng)中的三相電流是平衡的,即三相電流的矢量和為零。但是,在某些特殊情況下,三相電流的矢量和不為零,就會
    的頭像 發(fā)表于 07-15 14:53 ?6980次閱讀

    受控源什么情況下可看為電阻

    受控源,又稱為非獨立源,是指其電壓或電流值受電路中其他部分的電壓或電流控制的電源。受控源電路分析中具有重要的作用,其特性和行為與獨立源(如電池、發(fā)電機等)有所不同。在某些特定情況下,受控源可以看作
    的頭像 發(fā)表于 07-12 09:29 ?4163次閱讀