1. 
          

          1. 新聞動(dòng)態(tài)

            Mysql:好好的索引,為什么要下推?

            常見(jiàn)問(wèn)題 發(fā)布者:ou3377 2021-12-09 09:23 訪(fǎng)問(wèn)量:89


            圖片

            - 思維導圖 -




            回表操作


            對于數據庫來(lái)說(shuō),只要涉及到索引,必然繞不過(guò)去回表操作。當然這也是我們今天所講內容的前調基礎。


            說(shuō)到回表,我們需要從索引開(kāi)始說(shuō)起。別擔心,不會(huì )長(cháng)篇大論,這里只是簡(jiǎn)單講下主鍵索引與普通索引,目的是讓大家對回表操作有個(gè)認識。如果你對回表操作很熟悉了,那么可以跳過(guò)這一段。


            這里我們只以 Innodb 存儲引擎作為講解對象。


            主鍵索引


            主鍵索引在底層的數據存儲是通過(guò) B+ 樹(shù)來(lái)實(shí)現的。簡(jiǎn)單來(lái)說(shuō),就是除葉子節之外的其他節點(diǎn)都存儲的是主鍵值。而葉子節點(diǎn)上存儲的是整行的數據。


            大體結構如下圖所示。


            圖片


            非主鍵索引


            除了主鍵索引外,其它的索引都被稱(chēng)為非主鍵索引。與主鍵索引不同的是,非主鍵索引的葉子節點(diǎn)上存儲的是主鍵的值。


            圖片



            那讓我們再回到開(kāi)始的問(wèn)題,什么是回表操作?


            當我們在非主鍵索引上查找一行數據的時(shí)候,此時(shí)的查找方式是先搜索非主鍵索引樹(shù),拿到對應的主鍵值,再到主鍵索引樹(shù)上查找對應的行數據。


            這種操作就叫作回表操作。


            好了,這里你應該了解了什么是回表操作了。簡(jiǎn)單來(lái)講,就是在非主鍵索引樹(shù)上拿到對應的主鍵值,然后回到主鍵索引上找到對應的行數據。


            這樣做的前提條件是,所要查找的字段不存在于非主鍵索引樹(shù)上。





            低版本操作


            講完了回表操作,讓我們繼續回到這篇文章的主題——索引下推。


            其實(shí)在 Mysql 5.6 版本之前是沒(méi)有索引下推這個(gè)功能的,從 5.6 版本后才加上了這個(gè)優(yōu)化項。所以在引出索引下推前還是先回顧下沒(méi)有這個(gè)功能時(shí)是怎樣一種處理方式。


            我們以一個(gè)真實(shí)例子來(lái)進(jìn)行講解。


            在這里有張用戶(hù)表 user,記錄著(zhù)用戶(hù)的姓名,性別,身高,年齡等信息。表中 id 是自增主鍵,(name,sex) 是聯(lián)合索引。在這里用 1 表示男,2 表示女?,F在需要查找所有姓王的男性信息。


            SQL 實(shí)現起來(lái)很簡(jiǎn)單:


            圖片


            但是它的實(shí)現原理是什么呢?


            根據聯(lián)合索引最左前綴原則,我們在非主鍵索引樹(shù)上找到第一個(gè)滿(mǎn)足條件的值時(shí),通過(guò)葉子節點(diǎn)記錄的主鍵值再回到主鍵索引樹(shù)上查找到對應的行數據,再對比是否為當前所要查找的性別。


            整個(gè)原理可以用下邊的圖進(jìn)行表示。


            圖片


            看到了吧,低版本中需要每條數據都進(jìn)行回表,增加了樹(shù)的搜索次數。如果遇到所要查找的數據量很大的話(huà),性能必然有所缺失。





            高版本操作


            講完了低版本操作,讓我們繼續回到這篇文章的主題——索引下推。


            知道了痛點(diǎn),那么怎么解決。很簡(jiǎn)單,只有符合條件了再進(jìn)行回表。結合我們的例子來(lái)說(shuō)就是當滿(mǎn)足了性別 sex = 1 了,再回表查找。這樣原本可能需要進(jìn)行回表查找 4 次,現在可能只需要 2 次就可以了。


            圖片


            所以本質(zhì)來(lái)說(shuō),索引下推就是只有符合條件再進(jìn)行回表,對索引中包含的字段先進(jìn)行判斷,不符合條件的跳過(guò)。減少了不必要的回表操作。





            總結


            回表操作

            • 當所要查找的字段不在非主鍵索引樹(shù)上時(shí),需要通過(guò)葉子節點(diǎn)的主鍵值去主鍵索引上獲取對應的行數據,這個(gè)過(guò)程稱(chēng)為回表操作。

            作者|萊烏


            關(guān)鍵字: Mysql

            文章連接: http://www.gostscript.com/cjwt/790.html

            版權聲明:文章由 晨展科技 整理收集,來(lái)源于互聯(lián)網(wǎng)或者用戶(hù)投稿,如有侵權,請聯(lián)系我們,我們會(huì )立即刪除。如轉載請保留

            双腿国产亚洲精品无码不卡|国产91精品无码麻豆|97久久久久久久极品|无码人妻少妇久久中文字幕
                1.