<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        MySQLDISTINCT的基本實(shí)現(xiàn)原理

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 13:20:02
        文檔

        MySQLDISTINCT的基本實(shí)現(xiàn)原理

        MySQLDISTINCT的基本實(shí)現(xiàn)原理:接上一篇: MySQL 中 GROUP BY 基本實(shí)現(xiàn)原理 DISTINCT 實(shí)際上和 GROUP BY 操作的實(shí)現(xiàn)非常相似,只不過(guò)是在 GROUP BY 之后的每組中只取出一條記錄而已。所以,DISTINCT 的實(shí)現(xiàn)和 GROUP BY 的實(shí)現(xiàn)也基本差不多,沒(méi)有太大的區(qū)別。同樣可以通過(guò)松散索引掃描或者
        推薦度:
        導(dǎo)讀MySQLDISTINCT的基本實(shí)現(xiàn)原理:接上一篇: MySQL 中 GROUP BY 基本實(shí)現(xiàn)原理 DISTINCT 實(shí)際上和 GROUP BY 操作的實(shí)現(xiàn)非常相似,只不過(guò)是在 GROUP BY 之后的每組中只取出一條記錄而已。所以,DISTINCT 的實(shí)現(xiàn)和 GROUP BY 的實(shí)現(xiàn)也基本差不多,沒(méi)有太大的區(qū)別。同樣可以通過(guò)松散索引掃描或者

        接上一篇: MySQL 中 GROUP BY 基本實(shí)現(xiàn)原理 DISTINCT 實(shí)際上和 GROUP BY 操作的實(shí)現(xiàn)非常相似,只不過(guò)是在 GROUP BY 之后的每組中只取出一條記錄而已。所以,DISTINCT 的實(shí)現(xiàn)和 GROUP BY 的實(shí)現(xiàn)也基本差不多,沒(méi)有太大的區(qū)別。同樣可以通過(guò)松散索引掃描或者

        接上一篇: MySQL 中 GROUP BY 基本實(shí)現(xiàn)原理
        DISTINCT 實(shí)際上和 GROUP BY 操作的實(shí)現(xiàn)非常相似,只不過(guò)是在 GROUP BY 之后的每組中只取出一條記錄而已。所以,DISTINCT 的實(shí)現(xiàn)和 GROUP BY 的實(shí)現(xiàn)也基本差不多,沒(méi)有太大的區(qū)別。同樣可以通過(guò)松散索引掃描或者是緊湊索引掃描來(lái)實(shí)現(xiàn),當(dāng)然,在無(wú)法僅僅使用索引即能完成 DISTINCT 的時(shí)候,MySQL 只能通過(guò)臨時(shí)表來(lái)完成。但是,和 GROUP BY 有一點(diǎn)差別的是,DISTINCT 并不需要進(jìn)行排序。也就是說(shuō),在僅僅只是 DISTINCT 操作的 Query 如果無(wú)法僅僅利用索引完成操作的時(shí)候,MySQL 會(huì)利用臨時(shí)表來(lái)做一次數(shù)據(jù)的“緩存”,但是不會(huì)對(duì)臨時(shí)表中的數(shù)據(jù)進(jìn)行 filesort 操作。當(dāng)然,如果我們?cè)谶M(jìn)行 DISTINCT 的時(shí)候還使用了 GROUP BY 并進(jìn)行了分組,并使用了類似于 MAX 之類的聚合函數(shù)操作,就無(wú)法避免 filesort 了。

        下面我們就通過(guò)幾個(gè)簡(jiǎn)單的 Query 示例來(lái)展示一下 DISTINCT 的實(shí)現(xiàn)。

        1.首先看看通過(guò)松散索引掃描完成 DISTINCT 的操作:

        sky@localhost : example11:03:41> EXPLAINSELECTDISTINCTgroup_id
        -> FROMgroup_messageG
        *************************** 1.row ***************************
        id: 1
        SELECT_type: SIMPLE
        table: group_message
        type: range
        possible_keys: NULL
        key: idx_gid_uid_gc
        key_len: 4
        ref: NULL
        rows: 10
        Extra: Usingindexforgroup-by
        1rowinset(0.00sec)

        我們可以很清晰的看到,執(zhí)行計(jì)劃中的 Extra 信息為“Using index for group-by”,這代表什么意思?為什么我沒(méi)有進(jìn)行 GROUP BY 操作的時(shí)候,執(zhí)行計(jì)劃中會(huì)告訴我這里通過(guò)索引進(jìn)行了 GROUP BY 呢?其實(shí)這就是于 DISTINCT 的實(shí)現(xiàn)原理相關(guān)的,在實(shí)現(xiàn) DISTINCT的過(guò)程中,同樣也是需要分組的,然后再?gòu)拿拷M數(shù)據(jù)中取出一條返回給客戶端。而這里的 Extra 信息就告訴我們,MySQL 利用松散索引掃描就完成了整個(gè)操作。當(dāng)然,如果 MySQL Query Optimizer 要是能夠做的再人性化一點(diǎn)將這里的信息換成“Using index for distinct”那就更好更容易讓人理解了,呵呵。

        2.我們?cè)賮?lái)看看通過(guò)緊湊索引掃描的示例:

        sky@localhost : example11:03:53> EXPLAINSELECTDISTINCTuser_id
        -> FROMgroup_message
        -> WHEREgroup_id = 2G
        *************************** 1.row ***************************
        id: 1
        SELECT_type: SIMPLE
        table: group_message
        type: ref
        possible_keys: idx_gid_uid_gc
        key: idx_gid_uid_gc
        key_len: 4
        ref: const
        rows: 4
        Extra: UsingWHERE; Usingindex
        1rowinset(0.00sec)

        這里的顯示和通過(guò)緊湊索引掃描實(shí)現(xiàn) GROUP BY 也完全一樣。實(shí)際上,這個(gè) Query 的實(shí)現(xiàn)過(guò)程中,MySQL 會(huì)讓存儲(chǔ)引擎掃描 group_id = 2 的所有索引鍵,得出所有的 user_id,然后利用索引的已排序特性,每更換一個(gè) user_id 的索引鍵值的時(shí)候保留一條信息,即可在掃描完所有 gruop_id = 2 的索引鍵的時(shí)候完成整個(gè) DISTINCT 操作。

        3.下面我們?cè)诳纯礋o(wú)法單獨(dú)使用索引即可完成 DISTINCT 的時(shí)候會(huì)是怎樣:

        sky@localhost : example11:04:40> EXPLAINSELECTDISTINCTuser_id
        -> FROMgroup_message
        -> WHEREgroup_id > 1ANDgroup_id < 10G
        *************************** 1.row ***************************
        id: 1
        SELECT_type: SIMPLE
        table: group_message
        type: range
        possible_keys: idx_gid_uid_gc
        key: idx_gid_uid_gc
        key_len: 4
        ref: NULL
        rows: 32
        Extra: UsingWHERE; Usingindex; Usingtemporary
        1rowinset(0.00sec)

        當(dāng) MySQL 無(wú)法僅僅依賴索引即可完成 DISTINCT 操作的時(shí)候,就不得不使用臨時(shí)表來(lái)進(jìn)行相應(yīng)的操作了。但是我們可以看到,在 MySQL 利用臨時(shí)表來(lái)完成 DISTINCT 的時(shí)候,和處理 GROUP BY 有一點(diǎn)區(qū)別,就是少了 filesort。實(shí)際上,在 MySQL 的分組算法中,并不一定非要排序才能完成分組操作的,這一點(diǎn)在上面的 GROUP BY 優(yōu)化小技巧中我已經(jīng)提到過(guò)了。實(shí)際上這里 MySQL 正是在沒(méi)有排序的情況下實(shí)現(xiàn)分組最后完成 DISTINCT 操作的,所以少了 filesort 這個(gè)排序操作。

        4.最后再和 GROUP BY 結(jié)合試試看:

        sky@localhost : example11:05:06> EXPLAINSELECTDISTINCTmax(user_id)
        -> FROMgroup_message
        -> WHEREgroup_id > 1ANDgroup_id < 10
        -> GROUPBYgroup_idG
        *************************** 1.row ***************************
        id: 1
        SELECT_type: SIMPLE
        table: group_message
        type: range
        possible_keys: idx_gid_uid_gc
        key: idx_gid_uid_gc
        key_len: 4
        ref: NULL
        rows: 32
        Extra: UsingWHERE; Usingindex; Usingtemporary; Usingfilesort
        1rowinset(0.00sec)

        最后我們?cè)倏匆幌逻@個(gè)和 GROUP BY 一起使用帶有聚合函數(shù)的示例,和上面第三個(gè)示例相比,可以看到已經(jīng)多了 filesort 排序操作了,正是因?yàn)槲覀兪褂昧?MAX 函數(shù)的緣故。要取得分組后的 MAX 值,又無(wú)法使用索引完成操作,只能通過(guò)排序才行了。

        由于 DISTINCT的實(shí)現(xiàn)基本上和 GROUP BY 的實(shí)現(xiàn)差不多,所以這篇文章就不再畫(huà)圖展示實(shí)現(xiàn)過(guò)程了,大家可以通過(guò) 上一篇文章中關(guān)于 GROUP BY 的基本實(shí)現(xiàn)原理中的插圖了解詳情

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        MySQLDISTINCT的基本實(shí)現(xiàn)原理

        MySQLDISTINCT的基本實(shí)現(xiàn)原理:接上一篇: MySQL 中 GROUP BY 基本實(shí)現(xiàn)原理 DISTINCT 實(shí)際上和 GROUP BY 操作的實(shí)現(xiàn)非常相似,只不過(guò)是在 GROUP BY 之后的每組中只取出一條記錄而已。所以,DISTINCT 的實(shí)現(xiàn)和 GROUP BY 的實(shí)現(xiàn)也基本差不多,沒(méi)有太大的區(qū)別。同樣可以通過(guò)松散索引掃描或者
        推薦度:
        標(biāo)簽: 原理 實(shí)現(xiàn) 基本
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 一级毛片试看60分钟免费播放| 91亚洲国产成人久久精品网址| 亚洲第一成年免费网站| 91精品国产免费久久久久久青草| 亚洲视频在线观看一区| 97视频免费观看2区| 亚洲国产精品第一区二区| **俄罗斯毛片免费| 亚洲欧洲日产v特级毛片| 97视频免费在线| 99亚偷拍自图区亚洲| 在线观看91精品国产不卡免费| 国产精品亚洲精品日韩电影| 亚洲第一网站男人都懂| 特级做A爰片毛片免费看无码| 亚洲男同帅GAY片在线观看| 国产成人AV片无码免费| 亚洲精品国产专区91在线| 中国在线观看免费高清完整版| 亚洲中文无码亚洲人成影院| 国产精品免费小视频| 特级aa**毛片免费观看| 亚洲级αV无码毛片久久精品| 日本在线看片免费人成视频1000| 亚洲成人黄色网址| 四虎永久在线精品免费影视| 亚洲天堂免费在线视频| 久久亚洲成a人片| 久久久久国色AV免费观看性色| 美女黄色免费网站| 久久久综合亚洲色一区二区三区| 国产大片线上免费观看| 日本特黄特色AAA大片免费| 亚洲国产精品久久久久婷婷软件 | 在线免费观看伊人三级电影| 亚洲va无码手机在线电影| 噜噜嘿在线视频免费观看| 国产免费网站看v片在线| 亚洲va久久久久| 亚洲成Av人片乱码色午夜| AV免费网址在线观看|