一 MyISAM索引實現
1. 主鍵索引
MyISAM引擎使用B+樹作為索引結果,葉節點的data域存放的是數據記錄的地址。下圖為MyISAM表的主索引,Col1為主鍵。
2. 輔助索引
在MyISAM中,主索引和輔助索引在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重復。下圖在Col2上建立一個輔助索引
同樣也是一顆B+Tree,data域保存數據記錄的地址。因此,MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應數據記錄。
MyISAM的索引方式也叫做“非聚集”的,之所以這么稱呼是為了與InnoDB的聚集索引區分。
二 InnoDB索引實現
1 主鍵索引
同樣是B+樹,實現方式卻完全不同。InnoDB表數據文件本身就是一個索引結構,樹的葉節點data域保存了完整的數據記錄,這種索引叫做聚集索引。
因為InnoDB的數據文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則mysql會自動選擇一個可以唯一標識數據記錄的列作為主鍵。如果不存在這種列,則mysql自動為InnoDB表生成一個隱含字段作為主鍵,這個字段長度為6個字節,類型為長整型。
2 輔助索引
InnoDB的所有輔助索引都引用主鍵作為data域。下圖為定義在Col3上的一個輔助索引
因此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支持
未完待續