一篇讀懂Mysql索引

索引介紹

索引是個什麼東西

官方介紹:幫助mysql高效獲取數據的數據結構。簡單說,數據庫的索引就跟書的目錄是一個東西,可以 幫助咱們更快的找到咱們想要的東西,提升數據庫的查詢速度。html

索引的優劣勢

索引的優點

  • 檢索:索引能夠提升數據庫的查詢效率,下降查詢的IO成本。
  • 排序:經過索引列對數據庫進行排序,能夠下降CPU的消耗.
    • 被檢索的索引會進行自動排序,包括單列索引和組合索引,組合索引的排序會更復雜
    • 若是按照索引列的順序進行排序,就是order by,效率就會提高較多
    • where索引列會在存儲引擎層進行處理,也就是索引下推

索引的劣勢

  • 索引會佔據磁盤空間
  • 索引能夠提升查詢效率,可是會下降更新表的效率,就是增刪改,由於MYSQL不只須要保持數據,同時須要更新對應的索引文件。

索引的分類

  • 主鍵索引:根據表的主鍵mysql自動建立的索引,不容許重複,也不容許null
  • 單列索引:即一個索引只包含單個列,一個表能夠有多個單列索引
  • 惟一索引:索引列的值必須惟一,但容許有空值
  • 組合索引:多個列組合成的索引
  • 全文索引:將整個文本造成索引,mysql中只有MyIASM和Innodb支持

索引的原理分析

索引的存儲結構

索引是由存儲引擎實現的,所以不一樣的存儲引擎會使用不一樣的索引。MyISAM和Innodb默認的索引是B+Tree。Memory支持HASH和BTree。
複製代碼

B樹和B+樹

這裏給你們推薦一個數據結構的演示網站,我的以爲挺好的 www.cs.usfca.edu/~galles/vis…mysql

  • B樹

  • B+Tree

從上面B數的圖能夠看出來,B樹是多叉的平衡樹,內節點能夠有多個分叉.B樹的高度通常是2-4層,樹的高度會對IO讀寫的次數形成直接的影響,4層的樹結構能夠支撐的數據能夠達到幾個個T

二者區別

兩者的主要區別就是在於非葉子節點是否存儲數據.B樹的葉子節點和非葉子節點都會存儲數據。而B+樹只有葉子節點纔會存儲數據,並且存儲的數據都是在一行上,並且從圖中能夠看出來是有序的,造成一個單向的鏈表。sql

非彙集索引(MyISAM)

主鍵索引和輔助索引

在MyISAM中主鍵索引和輔助索引的結構是同樣的,在MyISAM中索引文件和數據是分開的所以稱爲非彙集索引.MyISAM中B+Tree的葉子節點存是數據是具體數據的指針值。查詢的時候,經過索引樹找到對應的節點,經過索引節點中存儲的記錄指針找到數據文件中對應的記錄。上圖中的索引樹就存在以前說的索引文件(myi)中,具體的數據存儲在數據文件(myd)中。數據庫

彙集索引(Innodb)

Innodb使用的是彙集索引,索引和數據都存在ibd文件中,看下具體的存儲結構。數據結構

主鍵索引

咱們能夠看到Innodb中主鍵索引B+Tree的葉子節點直接掛載全部的數據,經過主鍵查詢的時候能夠直接找到全部的數據。

輔助索引

輔助索引中葉子節點掛載的數據其實是主鍵id,也就是若是查詢的時候若是使用的不是主鍵索引,查詢的字段也不是對應的索引列就會進行回表,也就是說先查詢輔助索引樹找到對應節點下的主鍵id,再經過這個主鍵id到主鍵索引樹中找對對應的索引節點,查找到該節點下掛載的數據。對於這種狀況,咱們能夠用覆蓋索引避免回表,也就是把要查詢的字段設置成組合索引一塊兒查出來。
相關文章
相關標籤/搜索