一、MyISAM 使用B+Tree 做爲索引結構,葉子節點的data存放指針,也就是記錄的地址。對於主鍵索引和輔助索引都是同樣的。
二、InnoDB 也使用B+Tree做爲索引結構,也別須要注意的是,對於主鍵索引,InnoDB 使用匯集索引,InnoDB的數據文件自己就是就是索引文件。而MyISAM,主鍵索引和數據文件是分離的。
三、InnoDB數據文件,要按主鍵彙集索引,這就要求InnoDB的表必需要有主鍵(MyISAM能夠沒有)。若是沒有顯式指定主鍵,InnoDB會自動選擇一個能夠惟一標識記錄的字段做爲主鍵,好比auto_increment的字段,若是不存在這樣的列,InnoDB會自動生成一個隱含字段做爲主鍵,這個隱含字段6個字節,是長整形。
四、對於InnoDB的輔助索引,葉子節點的data存放的是主鍵的值。這就意味着,使用輔助索引定位記錄,須要使用兩次索引:首先使用輔助索引找到主鍵的值,根據主鍵的值,使用主鍵索引找到記錄。
五、InnoDB的輔助索引爲何要這樣設計?
若是輔助索引data存放的行指針,當行移動或者數據頁分裂時,須要更新data域行指針的值,這就增長維護成本。data存在主鍵的值,就沒有這個問題。行移動和數據頁分裂,主鍵索引會自動更新。data關聯主鍵的值,不須要更新,至關於增長一個間接層。這個間接層對性能的影響也很小,由於經過主鍵定位記錄是很是快的。
六、瞭解了innoDB的索引實現,有幾個地方須要注意:
不要使用過長的字段做爲主鍵,由於輔助索引都要使用主鍵索引定位記錄,這個字段過長,使用內存更大,影響性能。
使用單調的字段做爲主鍵,特別是insert的時候,若是是非單調的,B+Tree維護成本很高。
七、這就能很好解釋,隔離級別 repeatable-read, 不使用索引鎖住整個表,使用索引(主鍵索引或者輔助索引)只會鎖住對應的行。
八、在查詢執行計劃中,有一個字段 type, eq_ref 表示使用主鍵索引,直接定位到記錄。而ref 表示先使用輔助索引,找到主鍵的值,再使用主鍵索引定位到記錄。性能