B+樹葉子結點到底存儲了什麼?

首先MYSQL默認InnoDB引擎,該引擎默認B+樹;先說結論:B+樹葉子結點存儲的是主鍵KEY或者具體數據。分情況討論:

主鍵KEY

比如說user_name是個索引,當執行該SQL:select * from user_info where `user_name` = 'xiaoming'; InnoDB 就會建立 user_name 索引 B+樹,節點裏存的是 user_name 這個 KEY,葉子節點存儲的數據的是主鍵 KEY。注意,葉子存儲的是主鍵 KEY!拿到主鍵 KEY 後,InnoDB 纔會去主鍵索引樹里根據剛在 user_name 索引樹找到的主鍵 KEY 查找到對應的數據。

具體數據

在執行 select * from user_info where id = 5 這個語句時,InnoDB 就會查詢這顆主鍵 ID 索引 B+樹,找到對應的 user_name='Bob'。

原因

問題來了,爲什麼 InnoDB 只在主鍵索引樹的葉子節點存儲了具體數據,但是其他索引樹卻不存具體數據呢,而要多此一舉先找到主鍵,再在主鍵索引樹找到對應的數據呢?

其實很簡單,因爲 InnoDB 需要節省存儲空間。一個表裏可能有很多個索引,InnoDB 都會給每個加了索引的字段生成索引樹,如果每個字段的索引樹都存儲了具體數據,那麼這個表的索引數據文件就變得非常巨大(數據極度冗餘了)。從節約磁盤空間的角度來說,真的沒有必要每個字段索引樹都存具體數據,通過這種看似“多此一舉”的步驟,在犧牲較少查詢的性能下節省了巨大的磁盤空間,這是非常有值得的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章