MySQL數(shù)據(jù)庫分為兩種存儲引擎MyISAM引擎與InnoDB。其中最主要區(qū)別在于InnoDB是聚集索引而MyISAM是非聚集索引。想要知道如何設(shè)計lnnoDB主鍵索引,我們則需要先理解其索引是如何實現(xiàn)才能進行合理有效的設(shè)計。
InnoDB索引實現(xiàn)
InnoDB使用B+Tree作為索引結(jié)構(gòu),數(shù)據(jù)文件本身就是索引文件。在InnoDB中,表數(shù)據(jù)文件本身就是按B+Tree組織的一個索引結(jié)構(gòu),這棵樹的葉節(jié)點data域保存了完整的數(shù)據(jù)記錄。這個索引的key是數(shù)據(jù)表的主鍵,因此InnoDB表數(shù)據(jù)文件本身就是主索引。
上圖是InnoDB主索引(同時也是數(shù)據(jù)文件)的示意圖,可以看到葉節(jié)點包含了完整的數(shù)據(jù)記錄如子葉數(shù)據(jù)文件就可以理解為索引文件,15為key主鍵,這種索引叫做聚集索引。因為InnoDB的數(shù)據(jù)文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統(tǒng)會自動選擇一個可以唯一標識數(shù)據(jù)記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵,這個字段長度為6個字節(jié),類型為長整形。
其次,InnoDB的輔助索引data域存儲的是主鍵的值而不是地址。既InnoDB的所有輔助索引都引用主鍵作為data域。例如,下圖子葉中輔助索引Alice的data存的是主鍵的值
所以當使用輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。
設(shè)計的思路
在InnoDB的索引實現(xiàn)后我們就可以根據(jù)其特性作出相應(yīng)的設(shè)計了,如
- 不使用過長的字段作為主鍵,因為所有輔助索引都引用了主索引,過長的主索引會令輔助索引變得過大。
- 不使用非唯一的字段作為主鍵在InnoDB,因為InnoDB數(shù)據(jù)文件本身是一顆B+Tree,非唯一主鍵會造成在插入新記錄時數(shù)據(jù)文件為了維持B+Tree的特性而頻繁的分裂調(diào)整,十分低效,使用自增字段作為主鍵則是一個不錯的方式。