MyISAM 和 InnoDB 索引的區別

一 MyISAM索引實現

1. 主鍵索引

MyISAM引擎使用B+樹做爲索引結果,葉節點的data域存放的是數據記錄的地址。下圖爲MyISAM表的主索引,Col1爲主鍵。mysql

 

2. 輔助索引

在MyISAM中,主索引和輔助索引在結構上沒有任何區別,只是主索引要求key是惟一的,而輔助索引的key能夠重複。下圖在Col2上創建一個輔助索引算法

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

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

 

 

二 InnoDB索引實現

1 主鍵索引

一樣是B+樹,實現方式卻徹底不一樣。InnoDB表數據文件自己就是一個索引結構,樹的葉節點data域保存了完整的數據記錄,這種索引叫作彙集索引優化

 由於InnoDB的數據文件自己要按主鍵彙集,因此InnoDB要求表必須有主鍵(MyISAM能夠沒有),若是沒有顯式指定,則mysql會自動選擇一個能夠惟一標識數據記錄的列做爲主鍵。若是不存在這種列,則mysql自動爲InnoDB表生成一個隱含字段做爲主鍵,這個字段長度爲6個字節,類型爲長整型。插件

 

2 輔助索引

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

所以InnoDB 的索引能提供一種很是快速的主鍵查找性能。不過,它的輔助索引也會包含主鍵列,因此若是主鍵定義的比較大,其餘索引也將很大。InnoDB 不會壓縮索引。索引

彙集索引這種實現方式使得按主鍵的搜索十分高效,可是輔助索引搜索須要檢索兩遍索引:首先檢索輔助索引得到主鍵,而後用主鍵到主索引中檢索得到記錄。事務

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

 

 

InnoDB索引MyISAM索引的區別

1 存儲結構(主索引/輔助索引)

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

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

innoDB是聚簇索引,數據掛在逐漸索引之下。

2 鎖

MyISAM使用的是表鎖

InnoDB使用行鎖

3 事務

MyISAM沒有事務支持和MVCC

InnoDB支持事務和MVCC

4 全文索引

MyISAM支持FULLTEXT類型的全文索引

InnoDB不支持FULLTEXT類型的全文索引,可是InnoDB可使用sphinx插件支持全文索引,而且效果更好

5 主鍵

MyISAM容許沒有任何索引和主鍵的表存在,索引都是保存行的地址

InnoDB若是沒有設定主鍵或非空惟一索引,就會自動生成一個6字節的主鍵,數據是主索引的一部分,附加索引保存的是主索引的值

6 外鍵

 MyISAM不支持

InnoDB支持

 

未完待續

相關文章
相關標籤/搜索