MyISAM索引實現
MyISAM索引文件和數據文件是分離的,索引文件的data域保存記錄所在頁的地址(物理存儲位置),通過這些地址來讀取頁,進而讀取被索引的行數據。
MyISAM的索引原理圖如下,Col1為主鍵:
而對於二級索引,在 MyISAM存儲引擎中以與上圖同樣的方式實現,也就是主索引和輔助索引在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重復。
InnoDB索引實現
1、聚集索引
InnoDB存儲引擎表是索引組織表,即按照主鍵的順序存儲數據。
與 MyISAM相同的一點是,InnoDB 也采用 B+Tree這種數據結構來實現 B-Tree索引。而很大的區別在於,InnoDB 存儲引擎采用“聚集索引”的數據存儲方式實現B-Tree索引,
聚集索引(clustered index)就是按照每張表的主鍵構造一棵B+樹,樹中的葉子節點存放着表中的行記錄數據也就是數據行和相鄰的鍵值緊湊地存儲在一起。
下圖為 InnoDB聚集索引原理圖:
由此可看出InnoDB的數據文件本身要按主鍵聚集,因此在InnoDB中要求一張表必須有主鍵(而MyISAM引擎中可以沒有),如果沒有顯式指定主鍵,MySQL會自動選擇一個可以唯一標識數據記錄的列作為主鍵。如果還 不存在這種列,則MySQL自動為InnoDB表生成一個長整型、長度為6個字節的隱含字段作為主鍵。
2、輔助索引
InnoDB對輔助索引采取的方式是在葉子頁中保存主鍵值,通過這個主鍵值來回表查詢到一條完整記錄,所以按輔助索引檢索實際上進行了二次查詢,效率肯定是沒有按照主鍵檢索高的。下圖是輔助索引的實現方式:
由於輔助索引包含主鍵索引,為了減小輔助索引所占空間,我們應該將 InnoDB 表中的主鍵索引盡量定義得小一些(MySIAM會使用前綴壓縮技術使得索引變小,而InnoDB不會壓縮索引)。
同時由於InnoDB數據文件本身是一棵B+Tree,非單調的主鍵會造成在插入新記錄時數據文件為了維持B+Tree的特性而頻繁的分裂調整,造成效率低下,而使用自增字段作為主鍵則是一個很好的選擇。
總結:
InnoDB的數據文件本身就是主索引文件,而MyISAM的主索引和數據是分開的。
InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區別。
innoDB是聚簇索引,數據存儲在對應索引之下。