理解B+樹(shù),就能真正記住MySQL索引優(yōu)化規(guī)則

B+樹(shù)是一種多路搜索樹(shù),相較于B樹(shù)有以下特性:
節(jié)點(diǎn)分為內(nèi)部節(jié)點(diǎn)、葉子節(jié)點(diǎn)、根節(jié)點(diǎn)(根節(jié)點(diǎn)在某些情況下也屬于內(nèi)部節(jié)點(diǎn)、葉子節(jié)點(diǎn))。
每個(gè)節(jié)點(diǎn)最多包含m-1個(gè)關(guān)鍵字、m個(gè)子節(jié)點(diǎn)。
內(nèi)部節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù)只作為索引使用,所有數(shù)據(jù)存儲(chǔ)在葉子節(jié)點(diǎn)中。
節(jié)點(diǎn)中的關(guān)鍵字均為有序,取節(jié)點(diǎn)中某一關(guān)鍵字x,x左側(cè)關(guān)鍵字與節(jié)點(diǎn)均小于x右側(cè)關(guān)鍵字與節(jié)點(diǎn)均大于x。
所有葉子節(jié)點(diǎn)由指針有序相連。

B+樹(shù)作為索引的優(yōu)勢(shì)

  1. 高效的查找性能: 通常情況下索引因大小問(wèn)題無(wú)法一次性加載到內(nèi)存中,必然涉及磁盤(pán)IO。B+樹(shù)的內(nèi)部節(jié)點(diǎn)不包含具體數(shù)據(jù)能夠包含更多的關(guān)鍵字以減少樹(shù)的高度,這就意味著可以減少磁盤(pán)IO。

  2. 適合范圍查詢: B+樹(shù)的葉子節(jié)點(diǎn)按照鍵值大小順序連接形成有序鏈表,這使得范圍查詢和范圍掃描操作變得高效。B+樹(shù)能夠快速定位到范圍查詢的起始位置,并且在有序鏈表上進(jìn)行連續(xù)掃描。

索引優(yōu)化和B+樹(shù)

  1. 出現(xiàn)在where關(guān)鍵詞后面的字段適合設(shè)置為索引列,或者連接子句中指定的列也是可以設(shè)置為索引列;
    選擇列創(chuàng)建索引~

  2. 對(duì)于唯一性的列,設(shè)置索引效果是最佳的;而對(duì)于具有多個(gè)重復(fù)值的列,其索引效果是最差的。 因此設(shè)置索引時(shí),大家需要考慮該列中值的分布情況;
    唯一索引在B+樹(shù)葉子節(jié)點(diǎn)中只占一個(gè)值,可以通過(guò)內(nèi)部節(jié)點(diǎn)快速找到。非唯一索引在找到之后還需要根據(jù)鏈表繼續(xù)向后查找。在極端情況下可能讀了一半葉子節(jié)點(diǎn)這樣索引基本沒(méi)有效果

  3. 短索引原則即指定前綴長(zhǎng)度,節(jié)省大量索引空間。 索引類(lèi)型占空間越小每次IO能夠讀取更多的節(jié)點(diǎn)。反之則增加磁盤(pán)IO次數(shù)。

  4. 適度設(shè)置索引列:設(shè)置索引時(shí)要考慮設(shè)置合適的列,不要造成“過(guò)多的索引列”。索引不是越多越好,在插入數(shù)據(jù)以及刪除數(shù)據(jù)時(shí)需要維護(hù)相應(yīng)的索引樹(shù)則會(huì)降低插入刪除效率。

  5. 聯(lián)合索引,遵循最左前綴匹配原則: 最左匹配原則并不是指查詢條件的順序,而是指查詢條件中是否包含索引最左列字段;
    使用聯(lián)合索引時(shí)索引樹(shù)內(nèi)關(guān)鍵字是同時(shí)包含聯(lián)合索引中所有的列并按照順序排列,如果不包含左側(cè)列的查詢時(shí)是無(wú)法使用聯(lián)合索引的。

  6. 索引列不能參與計(jì)算,保持列“干凈”: 如果索引列使用了函數(shù)或者其他計(jì)算就會(huì)導(dǎo)致索引失效,因?yàn)樗饕龢?shù)中存儲(chǔ)的都是原值如果應(yīng)用函數(shù)就要全部都應(yīng)用顯然得不償失。

  7. 范圍條件存在多個(gè)索引時(shí),查詢可以命中索引: 范圍條件有:<、<=、>、>=、between等,因?yàn)锽+樹(shù)的葉子節(jié)點(diǎn)都是有序存放的。如果是聯(lián)合索引則最左匹配原則遇到范圍查找后終止,返回查找后的列無(wú)法使用索引。因?yàn)榉秶檎页龅挠涗浭前凑兆髠?cè)列包含范圍查找列排序的,無(wú)法保證右側(cè)索引列有序故而右側(cè)索引列失效。

  8. 利用覆蓋索引進(jìn)行查詢,避免回表:innodb引擎是將所有數(shù)據(jù)存放在聚集索引中的,由主鍵構(gòu)成的索引包含記錄數(shù)據(jù)。其他索引時(shí)不包含記錄數(shù)據(jù)的只包含聚集索引中的主鍵,如果查詢使用了非聚集索引且改索引上無(wú)法滿足查詢則需要通過(guò)主鍵在聚集索引中再次檢索稱(chēng)之為回標(biāo),如果當(dāng)前索引中包含的查詢的所有列則可直接返回。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容