歡迎來到DIVCSS5查找CSS資料與學習DIV CSS布局技術!
聚簇索引就是innodb默認創建的基于主鍵的索引結構,而且表里的數據就是直接放在聚簇索引里,作為葉節點的數據頁:
 
基于主鍵的數據搜索:從聚簇索引的根節點開始進行二分查找,一路找到對應數據頁,基于頁目錄就直接定位到主鍵目標數據。
 
若想對其它字段建立索引,甚至是基于多個字段建立聯合索引,此時索引結構又是咋樣?
 
假設對其他字段建立索引,如name、age之類,都是一樣原理。比如你插入數據時:
 
把完整數據插入聚簇索引的葉節點的數據頁,同時維護好聚簇索引
 
為你其他字段建立的索引,重新再建立一顆B+樹
 
比如你基于name字段建立了一個索引,當插入數據時,就會重新搞一顆B+樹,B+樹的葉節點也是數據頁,但該數據頁里僅放主鍵字段和name字段:
 
這是獨立于聚簇索引之外的另一個name字段的B+索引樹,其葉節點的數據頁僅存放主鍵和name字段值。
 
整體排序規則都跟聚簇索引按照主鍵的排序規則是一樣,即:
 
葉節點的數據頁中的name值都是排序的
 
下一個數據頁里的name字段值都>上一個數據頁里的name字段值
 
name字段的索引B+樹也會構建多層級的索引頁,索引頁里存放:
 
下一層的頁號
 
最小name字段值,根據name字段值排序。
 
所以若你根據name字段查數據,過程也一樣,從name索引樹的根節點開始,一層一層往下找,一直找到葉節點的數據頁,定位到name字段值對應的主鍵值。
 
然后針對
 
select * from t where name='xx'
 
1
 
這種語句,先根據name值在name索引樹里找,找到葉節點,也僅能找到對應主鍵值,而找不到這行數據的所有字段。
 
所以還需回表:還需根據主鍵值,再到聚簇索引里從根節點開始,找到葉節點的數據頁,定位到主鍵值對應的完整數據行,此時才能把select *要的全部字段值都取出。
 
聯合索引
 
比如name+age,運行流程同理,建立一個獨立的B+樹,葉節點的數據頁存放id+name+age后,默認按name排序,name一樣就按age排,不同數據頁之間的name+age值的排序也如此。
 
然后這個name+age的聯合索引的B+樹的索引頁存放:
 
下一層節點的頁號
 
最小的name+age的值
 
所以當你根據name+age搜索時,就會走name+age聯合索引樹,搜索到主鍵,再根據主鍵到聚簇索引里去搜索。
 
總結
 
以上就是InnoDB索引的實現原理,就是建立B+樹,層層二分查找。不同的索引就是建立了不同B+樹,然后增刪改時:
 
在數據頁里更新數據
 
維護你所有的索引

如需轉載,請注明文章出處和來源網址:http://www.rs2pl.com/html/h65266.shtml

久久天天躁狠狠躁夜夜躁2020