一 MyISAM索引實現(xiàn)
1. 主鍵索引
MyISAM使用B+樹作為索引結(jié)構(gòu),葉節(jié)點data存放的是數(shù)據(jù)記錄的地址义起。下圖為MyISAM表的主索引师崎,Col1為主鍵。
2. 輔助索引(二級索引)
輔助索引跟主鍵索引在結(jié)構(gòu)上沒有任何區(qū)別齐蔽,只是主鍵索引的key要求是唯一的床估,輔助索引的key可以重復(fù)。上圖為Col2創(chuàng)建一個輔助索引谈况,也是一顆B+ Tree递胧,data域保存數(shù)據(jù)域的值為地址,讀取相應(yīng)的數(shù)據(jù)記錄缎脾。
MyISAM的索引結(jié)構(gòu)叫非聚簇索引,為了區(qū)別于InnoDB的聚簇索引联喘。
二 InnoDB索引實現(xiàn)
1 主鍵索引
主鍵索引也是B+樹結(jié)構(gòu),實現(xiàn)方式卻完全不同豁遭。InnoDB表數(shù)據(jù)文件本身就是一個索引結(jié)構(gòu),樹的葉節(jié)點存放了完整的數(shù)據(jù)記錄堤框,這種索引結(jié)構(gòu)叫聚簇索引。
?因為InnoDB的數(shù)據(jù)文件本身要按主鍵聚集启绰,所以InnoDB要求表必須有主鍵(MyISAM可以沒有)沟使,如果沒有顯式指定,則mysql會自動選擇一個可以唯一標識數(shù)據(jù)記錄的列作為主鍵着倾。如果不存在這種列,則mysql自動為InnoDB表生成一個隱含字段作為主鍵卡者,這個字段長度為6個字節(jié)客们,類型為長整型。
2 輔助索引
??InnoDB的所有輔助索引都引用主鍵作為data域底挫。下圖為定義在Col3上的一個輔助索引。
因此InnoDB 的索引能提供一種非秤澹快速的主鍵查找性能官边。不過,它的輔助索引也會包含主鍵列罐氨,所以如果主鍵定義的比較大,其他索引也將很大栅隐。InnoDB 不會壓縮索引。
聚集索引這種實現(xiàn)方式使得按主鍵的搜索十分高效谨究,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵泣棋,然后用主鍵到主索引中檢索獲得記錄。
不同存儲引擎的索引實現(xiàn)方式對于正確使用和優(yōu)化索引都非常有幫助潭辈,例如知道了InnoDB的索引實現(xiàn)后,就很容易明白為什么不建議使用過長的字段作為主鍵寄摆,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。再例如柏副,用非單調(diào)的字段作為主鍵在InnoDB中不是個好主意,因為InnoDB數(shù)據(jù)文件本身是一顆B+Tree眷篇,非單調(diào)的主鍵會造成在插入新記錄時數(shù)據(jù)文件為了維持B+Tree的特性而頻繁的分裂調(diào)整荔泳,十分低效,而使用自增字段作為主鍵則是一個很好的選擇换可。
三?InnoDB索引和MyISAM索引的區(qū)別
1 存儲結(jié)構(gòu)(主索引/輔助索引)
InnoDB的數(shù)據(jù)文件本身就是主索引文件沾鳄。而MyISAM的主索引和數(shù)據(jù)是分開的。
InnoDB的輔助索引data域存儲相應(yīng)記錄主鍵的值而不是地址译荞。而MyISAM的輔助索引和主索引沒有多大區(qū)別休弃。
innoDB是聚簇索引,數(shù)據(jù)掛在逐漸索引之下塔猾。
2 鎖
MyISAM使用的是表鎖
InnoDB使用行鎖
3 事務(wù)
MyISAM沒有事務(wù)支持和MVCC
InnoDB支持事務(wù)和MVCC
4 全文索引
MyISAM支持FULLTEXT類型的全文索引
InnoDB不支持FULLTEXT類型的全文索引,但是InnoDB可以使用sphinx插件支持全文索引,并且效果更好
5 主鍵
MyISAM允許沒有任何索引和主鍵的表存在得湘,索引都是保存行的地址
InnoDB如果沒有設(shè)定主鍵或非空唯一索引淘正,就會自動生成一個6字節(jié)的主鍵鸿吆,數(shù)據(jù)是主索引的一部分伞剑,附加索引保存的是主索引的值
6 外鍵
?MyISAM不支持
InnoDB支持