看圖說話
聚集索引特點(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,再回表獲取地址。