MyISAM和InnoDB的索引實現

 在 MySQL 中,主要有四種類型的索引,分別爲: B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引。咱們主要分析B-Tree 索引。算法

        B-Tree 索引是 MySQL 數據庫中使用最爲頻繁的索引類型,除了 Archive 存儲引擎以外的其餘全部的存儲引擎都支持 B-Tree 索引。Archive 引擎直到 MySQL 5.1 才支持索引,並且只支持索引單個 AUTO_INCREMENT 列。數據庫

       不只僅在 MySQL 中是如此,實際上在其餘的不少數據庫管理系統中B-Tree 索引也一樣是做爲最主要的索引類型,這主要是由於 B-Tree 索引的存儲結構在數據庫的數據檢索中有很是優異的表現。數據結構

     通常來講, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的結構來存儲的,也就是全部實際須要的數據都存放於 Tree 的 Leaf Node(葉子節點) ,並且到任何一個 Leaf Node 的最短路徑的長度都是徹底相同的,因此咱們你們都稱之爲 B-Tree 索引。固然,可能各類數據庫(或 MySQL 的各類存儲引擎)在存放本身的 B-Tree 索引的時候會對存儲結構稍做改造。如 Innodb 存儲引擎的 B-Tree 索引實際使用的存儲結構其實是 B+Tree,也就是在 B-Tree 數據結構的基礎上作了很小的改造,在每個Leaf Node 上面出了存放索引鍵的相關信息以外,還存儲了指向與該 Leaf Node 相鄰的後一個 LeafNode 的指針信息(增長了順序訪問指針),這主要是爲了加快檢索多個相鄰 Leaf Node 的效率考慮性能

 

下面主要討論MyISAM和InnoDB兩個存儲引擎的索引實現方式:優化

1. MyISAM索引實現:MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。

1)主鍵索引:spa

MyISAM引擎使用B+Tree做爲索引結構,葉節點的data域存放的是數據記錄的地址。下圖是MyISAM主鍵索引的原理圖:指針


                                                                           (圖myisam1)索引

這裏設表一共有三列,假設咱們以Col1爲主鍵,圖myisam1是一個MyISAM表的主索引(Primary key)示意。能夠看出MyISAM的索引文件僅僅保存數據記錄的地址。效率

2)輔助索引(Secondary key)基礎

在MyISAM中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求key是惟一的,而輔助索引的key能夠重複。若是咱們在Col2上創建一個輔助索引,則此索引的結構以下圖所示:
  

 

一樣也是一顆B+Tree,data域保存數據記錄的地址。所以,MyISAM中索引檢索的算法爲首先按照B+Tree搜索算法搜索索引,若是指定的Key存在,則取出其data域的值,而後以data域的值爲地址,讀取相應數據記錄。

MyISAM的索引方式也叫作「非彙集」的,之因此這麼稱呼是爲了與InnoDB的彙集索引區分。

 

2. InnoDB索引實現

然InnoDB也使用B+Tree做爲索引結構,但具體實現方式卻與MyISAM大相徑庭.

1)主鍵索引:

         MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。而在InnoDB中,表數據文件自己就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,所以InnoDB表數據文件自己就是主索引

               (圖inndb主鍵索引)

 

 

(圖inndb主鍵索引)是InnoDB主索引(同時也是數據文件)的示意圖,能夠看到葉節點包含了完整的數據記錄。這種索引叫作彙集索引。由於InnoDB的數據文件自己要按主鍵彙集,因此InnoDB要求表必須有主鍵(MyISAM能夠沒有),若是沒有顯式指定,則MySQL系統會自動選擇一個能夠惟一標識數據記錄的列做爲主鍵,若是不存在這種列,則MySQL自動爲InnoDB表生成一個隱含字段做爲主鍵,這個字段長度爲6個字節,類型爲長整形。

 

2). InnoDB的輔助索引

       InnoDB的全部輔助索引都引用主鍵做爲data域。例如,下圖爲定義在Col3上的一個輔助索引:

 

    

       

        InnoDB 表是基於聚簇索引創建的。所以InnoDB 的索引能提供一種很是快速的主鍵查找性能。不過,它的輔助索引(Secondary Index, 也就是非主鍵索引)也會包含主鍵列,因此,若是主鍵定義的比較大,其餘索引也將很大。若是想在表上定義 、不少索引,則爭取儘可能把主鍵定義得小一些。InnoDB 不會壓縮索引。

      文字符的ASCII碼做爲比較準則。彙集索引這種實現方式使得按主鍵的搜索十分高效,可是輔助索引搜索須要檢索兩遍索引:首先檢索輔助索引得到主鍵,而後用主鍵到主索引中檢索得到記錄

      不一樣存儲引擎的索引實現方式對於正確使用和優化索引都很是有幫助,例如知道了InnoDB的索引實現後,就很容易明白一、爲何不建議使用過長的字段做爲主鍵,由於全部輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。再例如,二、用非單調的字段做爲主鍵在InnoDB中不是個好主意,由於InnoDB數據文件自己是一顆B+Tree,非單調的主鍵會形成在插入新記錄時數據文件爲了維持B+Tree的特性而頻繁的分裂調整,十分低效,而使用自增字段做爲主鍵則是一個很好的選擇

 

 InnoDB索引MyISAM索引的區別:

一是主索引的區別,InnoDB的數據文件自己就是索引文件。而MyISAM的索引和數據是分開的。

二是輔助索引的區別:InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區別。

相關文章
相關標籤/搜索