咱們都知道MySQL裏,索引一般用B+樹來實現的。B+樹的葉子結點才具體保存數據(聚簇索引保存的是行數據;普通索引是主鍵,若有須要得回表),非葉子結點都是用來索引葉子結點的。假設索引高度爲h,那麼每次索引查詢都要查詢h個索引頁面才能找到葉子結點的索引數據。因此h的大小,勢必成爲索引效率的一個關鍵。那麼一般表的索引高度h是多大呢?spa
咱們再假設扇出係數爲k,則索引裏可索引key的數s=k^h。 索引
在InnoDB裏,每一個頁默認16KB,假設索引的是8B的long型數據,每一個key後有個頁號4B,還有6B的其餘數據(參考《MySQL技術內幕:InnoDB存儲引擎》P193的頁面數據),那麼每一個頁的扇出係數爲16KB/(8B+4B+6B)≈1000,即每一個頁能夠索引1000個key。在高度h=3時,s=1000^3=10億!!也就是說,InnoDB經過三次索引頁的I/O,便可索引10億的key。一般來講,索引樹的高度在2~4。固然,這也跟要索引字段的數據類型有關,若是是int或short,索引效率更好,而若是是varchar(100),那扇出係數就低了,索引效率天然要低些。因此咱們在索引字段時,字段的類型越簡單效率越好。get
具體如何查看索引樹的高度,可參考:查看 InnoDB表中每一個的索引高度效率