<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
        主站蜘蛛池模板: 亚洲一区二区三区不卡在线播放| 亚洲短视频在线观看| 亚洲爆乳少妇无码激情| 97在线线免费观看视频在线观看| 亚洲人成网址在线观看| 久久综合国产乱子伦精品免费 | 大陆一级毛片免费视频观看| 亚洲AV一二三区成人影片| 成人毛片18女人毛片免费| 亚洲AV无码国产剧情| 亚洲视频一区二区| 成人毛片100免费观看| 久久久久亚洲精品影视| 亚洲一级免费视频| 亚洲人成网站18禁止| 免费A级毛片无码A| 久久免费99精品国产自在现线| 亚洲韩国精品无码一区二区三区| 久久久久久影院久久久久免费精品国产小说 | 久久久精品视频免费观看| 91麻豆精品国产自产在线观看亚洲 | 5555在线播放免费播放| 亚洲av无码一区二区三区天堂古代| 青草草在线视频永久免费| 男女猛烈xx00免费视频试看| 国产精品亚洲玖玖玖在线观看| 国产拍拍拍无码视频免费| 亚洲网站在线播放| 国产伦精品一区二区三区免费迷| 免费手机在线看片| 久久久久亚洲Av无码专| 四虎国产精品免费视| 中文字幕久精品免费视频| 亚洲国产精品一区二区三区在线观看 | 亚洲剧场午夜在线观看| 免费va在线观看| 91香焦国产线观看看免费| 亚洲国产成人久久一区二区三区| 老司机亚洲精品影视www| 国产日本一线在线观看免费| 高潮毛片无遮挡高清免费|