二級索引是相對於聚簇索引而言的。mysql中innodb引擎會在表創建的時候自動生成一個聚簇索引而二級索引則不會當然二級索引也是有一棵屬於自己的B+樹的。我們可以把聚簇索引理解成系統定義的索引而二級索引則是用戶可以自定義的索引。
二級索引和聚簇索引還是有些區別的例如:聚簇索引在葉子節點中維護的是行號和用戶的真實記錄信息而二級索引則是行號和主鍵值。在查找過程中因為二級索引的葉子節點中存放的是主鍵值所以還需要根據主鍵值去聚簇索引中做一次回表操作,所以二級索引的效率相對聚簇索引而言還是要低一些的,但同樣二級索引的維護成本也要比聚簇索引低一些,因為二級索引中存放的是主鍵值而不是用戶的真實記錄,只有當主鍵值發生變化的時候二級索引才需要做一些變動而用戶真實記錄中的其它非主鍵值發生變化時二級索引是不需要變動的。
二級索引的查找:二級索引的查找方式和聚簇索引是類似的只要符合索引的使用規則二級索引也會采用二分法去逐層的完成查找操作然后根據查找到的主鍵值去聚簇索引中進行回表操作也就是說二級索引要想獲得一條完整的用戶記錄需要使用到兩棵B+樹。
二級索引的編輯:當編輯操作發生時只有影響到主鍵值的操作才會對二級索引進行改動。
二級索引中的聯合索引:既然二級索引是可以支持用戶自定義的那么我們在創建索引時列值可以是單列也可以是多列,多列的時候就叫做聯合索引。
聯合索引注意事項:在使用聯合索引的時候我們需要注意到最左前綴原則,這個是為mysql中二級索引樹中搜索的時候提供支持的,如果是范圍查找(<、>、between、like)或者不遵循最左前綴原則的時候會導致索引搜索的時候沒法准確的定位到具體的記錄則會導致索引使用失敗。這里需要說下order by 、group by他們其實也是可以用到聯合索引的但是需要他們的順序和聯合索引的順序保持一致或者where條件+排序順序保持一致因為這樣可以減少explain中file sort的操作從而提高整體檢索的效率。這也是聯合索引的一個好處可以減少表中數據的重排。因為聯合索引在B+樹中的存放是排好順序的(邏輯上的連續)