MySQL InnoDB 索引結(jié)構(gòu)淺析

看圖說話

聚集&非聚集索引

聚集索引特點(diǎn)

B+樹結(jié)構(gòu);

葉子節(jié)點(diǎn)存行記錄數(shù)據(jù),葉子節(jié)點(diǎn)初始化一頁(磁盤管理單位),當(dāng)一頁達(dá)到裝載因子(15/16)會(huì)自動(dòng)開辟新的頁;

行數(shù)據(jù)存儲(chǔ)按ID順序存儲(chǔ);

非聚集索引特點(diǎn)

葉子節(jié)點(diǎn)存索引數(shù)據(jù)和索引對(duì)應(yīng)的主鍵ID,比如圖中“年齡&姓名”組合索引;

獲取數(shù)據(jù)需要再次通過主鍵ID走一次聚集索引;

B+樹索引

矮胖平衡樹;

非葉子只存索引;

葉子節(jié)點(diǎn)是鏈表結(jié)構(gòu),具有順序性;

優(yōu)點(diǎn):層級(jí)低減少IO次數(shù),非葉子節(jié)點(diǎn)全部存儲(chǔ)索引地址,一次IO獲取一個(gè)Page,可最大獲取索引范圍,如果非葉子節(jié)點(diǎn)存數(shù)據(jù),可能需要多次IO才能取完索引范圍。

為什么主鍵要最好自增

葉子節(jié)點(diǎn)存數(shù)據(jù),且是按ID順序排序

如果不是順序的,就會(huì)發(fā)生插入行為,這樣就會(huì)發(fā)生數(shù)據(jù)遷移情況,造成多次IO發(fā)生

分布式ID生成器也是不能保障順序性,如snowflake,高位取時(shí)間戳,整體是趨勢增長,發(fā)生插入情況概率低,高并發(fā)情況下發(fā)生插入情況概率高些。

最左匹配原則

如圖中年齡&姓名索引,B+樹結(jié)構(gòu)根據(jù)最左字段年齡構(gòu)建。

葉子節(jié)點(diǎn)存儲(chǔ)年齡,姓名,主鍵ID,按年齡&姓名順序排序。

查詢條件必須帶有最左字段才能生效

回表和索引覆蓋

索引覆蓋:查詢語句select字段,索引中有,就不需要再通過主鍵ID走聚集索引獲取,反之就是需要回表,需要通過主鍵ID走聚集索引獲取。

栗子:select 年齡,姓名,ID? where 年齡=2,這個(gè)SQL 索引就可以覆蓋;

select 年齡,地址 where 年齡=2,這個(gè)SQL就需要先通過索引找到,主鍵索引值ID,再回表獲取地址。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容