索引介紹
索引是個什麼東西
官方介紹:幫助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樹是多叉的平衡樹,內節點能夠有多個分叉.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到主鍵索引樹中找對對應的索引節點,查找到該節點下掛載的數據。對於這種狀況,咱們能夠用覆蓋索引避免回表,也就是把要查詢的字段設置成組合索引一塊兒查出來。