一文了解MySQL二級索引的查詢過程
前言
聚簇索引就是innodb默認創(chuàng)建的基于主鍵的索引結(jié)構(gòu),而且表里的數(shù)據(jù)就是直接放在聚簇索引里,作為葉節(jié)點的數(shù)據(jù)頁:

基于主鍵的數(shù)據(jù)搜索:從聚簇索引的根節(jié)點開始進行二分查找,一路找到對應(yīng)數(shù)據(jù)頁,基于頁目錄就直接定位到主鍵目標(biāo)數(shù)據(jù)。
若想對其它字段建立索引,甚至是基于多個字段建立聯(lián)合索引,此時索引結(jié)構(gòu)又是咋樣?
假設(shè)對其他字段建立索引,如name、age之類,都是一樣原理。比如你插入數(shù)據(jù)時:
- 把完整數(shù)據(jù)插入聚簇索引的葉節(jié)點的數(shù)據(jù)頁,同時維護好聚簇索引
- 為你其他字段建立的索引,重新再建立一顆B+樹
比如你基于name字段建立了一個索引,當(dāng)插入數(shù)據(jù)時,就會重新搞一顆B+樹,B+樹的葉節(jié)點也是數(shù)據(jù)頁,但該數(shù)據(jù)頁里僅放主鍵字段和name字段:

這是獨立于聚簇索引之外的另一個name字段的B+索引樹,其葉節(jié)點的數(shù)據(jù)頁僅存放主鍵和name字段值。
整體排序規(guī)則都跟聚簇索引按照主鍵的排序規(guī)則是一樣,即:
- 葉節(jié)點的數(shù)據(jù)頁中的name值都是排序的
- 下一個數(shù)據(jù)頁里的name字段值都>上一個數(shù)據(jù)頁里的name字段值
name字段的索引B+樹也會構(gòu)建多層級的索引頁,索引頁里存放:
- 下一層的頁號
- 最小name字段值,根據(jù)name字段值排序。
所以若你根據(jù)name字段查數(shù)據(jù),過程也一樣,從name索引樹的根節(jié)點開始,一層一層往下找,一直找到葉節(jié)點的數(shù)據(jù)頁,定位到name字段值對應(yīng)的主鍵值。
然后針對
select * from t where name='xx'
這種語句,先根據(jù)name值在name索引樹里找,找到葉節(jié)點,也僅能找到對應(yīng)主鍵值,而找不到這行數(shù)據(jù)的所有字段。
所以還需回表:還需根據(jù)主鍵值,再到聚簇索引里從根節(jié)點開始,找到葉節(jié)點的數(shù)據(jù)頁,定位到主鍵值對應(yīng)的完整數(shù)據(jù)行,此時才能把select *要的全部字段值都取出。
聯(lián)合索引
比如name+age,運行流程同理,建立一個獨立的B+樹,葉節(jié)點的數(shù)據(jù)頁存放id+name+age后,默認按name排序,name一樣就按age排,不同數(shù)據(jù)頁之間的name+age值的排序也如此。
然后這個name+age的聯(lián)合索引的B+樹的索引頁存放:
- 下一層節(jié)點的頁號
- 最小的name+age的值
所以當(dāng)你根據(jù)name+age搜索時,就會走name+age聯(lián)合索引樹,搜索到主鍵,再根據(jù)主鍵到聚簇索引里去搜索。
總結(jié)
以上就是InnoDB索引的實現(xiàn)原理,就是建立B+樹,層層二分查找。不同的索引就是建立了不同B+樹,然后增刪改時:
在數(shù)據(jù)頁里更新數(shù)據(jù)維護你所有的索引
到此這篇關(guān)于MySQL二級索引查詢過程的文章就介紹到這了,更多相關(guān)MySQL二級索引查詢過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL用戶和權(quán)限及破解root口令的方法示例
這篇文章主要介紹了詳解MySQL用戶和權(quán)限及破解root口令,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
Mysql存儲引擎InnoDB和Myisam的六大區(qū)別
這篇文章主要介紹了Mysql存儲引擎InnoDB和Myisam的六大區(qū)別,本文從構(gòu)成上、事務(wù)處理、SQL操作、自動ID、表行數(shù)等方面講解了它的區(qū)別,需要的朋友可以參考下2015-02-02
mysql基礎(chǔ)架構(gòu)教程之查詢語句執(zhí)行的流程詳解
這篇文章主要給大家介紹了關(guān)于mysql基礎(chǔ)架構(gòu)教程之查詢語句執(zhí)行流程的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧2018-11-11
MySQL 5.7.14 net start mysql 服務(wù)無法啟動-“NET HELPMSG 3534” 的奇怪問題
這篇文章主要介紹了MySQL 5.7.14 net start mysql 服務(wù)無法啟動-“NET HELPMSG 3534” 的奇怪問題,需要的朋友可以參考下2016-12-12
大數(shù)據(jù)小內(nèi)存排序問題如何巧妙解決
文章介紹了大數(shù)據(jù)小內(nèi)存排序的三種方法:數(shù)據(jù)庫排序、分治法和位圖法,數(shù)據(jù)庫排序簡單但速度慢,對設(shè)備要求高;分治法高效但實現(xiàn)復(fù)雜;位圖法可讀性差,但存儲空間受限2025-01-01
IDEA鏈接MySQL報錯08001和連接成功后不顯示表的問題及解決方法
這篇文章主要介紹了IDEA鏈接MySQL報錯08001和連接成功后不顯示表的問題及解決方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
MySQL使用全庫備份數(shù)據(jù)恢復(fù)單表數(shù)據(jù)的方法
這篇文章主要給大家介紹了關(guān)于MySQL使用全庫備份數(shù)據(jù)恢復(fù)單表數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧2018-12-12

