【深入理解MySQL的索引數據結構】

文章目錄

    • 📕索引底層數據結構與算法
      • 📙索引數據結構
        • 📘二叉樹
        • 📘紅黑樹
        • 📘Hash
        • 📘B-Tree
        • 📘B+Tree
      • 📙表在不同存儲引擎的存儲結構
        • 📘MyISAM存儲引擎索引實現
          • 📚文件結構
          • 📚非聚集索引
        • 📘InnoDB存儲引擎索引實現
          • 📚文件結構
          • 📚聚集索引
      • 📙為什么DBA總推薦使用整型自增主鍵做索引
      • 📙為什么非主鍵索引結構葉子節點存儲的是主鍵值?
      • 📙MySQL最左前綴優化原則是怎么回事

📕索引底層數據結構與算法

📙索引數據結構

📘二叉樹

二叉樹數據結構

📘紅黑樹

紅黑樹的數據結構

📘Hash

Hash

  • 對索引的key進行一次hash計算就可以定位出數據存儲的位置,很多時候Hash索引要比B+Tree索引更高效
  • 僅能滿足 “=”,“IN”,不支持范圍查詢,hash沖突問題。
📘B-Tree

B樹

  • 索引元素不重復
  • 從左到右遞增排列。
📘B+Tree

B+樹

  • 非葉子節點不存儲data,只存儲索引(冗余),可以放更多的索引
  • 葉子節點包含所有索引字段
  • 葉子節點用指針連接,提高區間訪問的性能
  • 可以支持范圍查詢,有雙向指針,假如查詢Col1>30通過雙向指針直接可以查詢出來大于30的數據,而不是像B-Tree一樣需要重新從根節點查詢。

📙表在不同存儲引擎的存儲結構

📘MyISAM存儲引擎索引實現
📚文件結構

表在不同存儲引擎的存儲結構

  • .frm結尾的文件:表結構文件
  • .MYD結尾的文件:數據文件
  • .MYI結尾的文件:索引文件
📚非聚集索引

假設查詢Col1=30,這個時候會先去.MYI結尾的索引文件找到磁盤地址0XF3,然后再去.MYD結尾的數據文件獲取這一行數據。索引和數據分開存儲就叫做非聚集索引。
MyISAM存儲引擎索引實現

📘InnoDB存儲引擎索引實現
📚文件結構

InnoDB存儲引擎索引實現

  • .frm結尾的文件:表結構文件
  • .ibd結尾的文件:數據和索引文件,按照B+Tree組織的一個索引結構文件
📚聚集索引

聚集索引
葉節點包含整行記錄,例如Col1=30會把其他行(Col2、Col3)的數據放到一起,這就是聚集索引。從結構上來說,聚集索引直接就獲取到了整行數據性能比非聚集索引效率更高。

📙為什么DBA總推薦使用整型自增主鍵做索引

前面提到 InnoDB存儲引擎中.ibd文件必須要用B+Tree來組織索引結構。

  • 如果表里面有主鍵,那么就可以直接使用主鍵作為B+Tree來組織索引結構。
  • 如果表里面沒有創建主鍵,它會從表中選擇一列所以數據不重復的列作為主鍵。
  • 如果沒有選到不重復的列,這個時候MySQL才會自增隱藏列作為主鍵。
  • 通常情況都會自己選擇一列作為主鍵,而不是交由MySQL自增隱藏列,減少MySQL的工作。

選擇整型效率更快。

  • 如果以字符串作為主鍵,那么要逐個字符對比ASCII碼,這種工作模式在對比過程中,如果二個對比結果前面相同,就最后一個字符不相同,浪費的性能還是很高的。
  • 整型存儲的空間更小,會節約硬件資源。

假設我先插入8后插入7,即非自增插入數據,這個B+Tree結果是如何變化的呢?
自增5/6/8這個大節點放滿了,插入7
自增放不下了,進行拆分平衡

自增假設后面插入9/10這種自增的數據,B+Tree會直接往后面開一個節點,性能比對來說,肯定是自增的會高一些。

📙為什么非主鍵索引結構葉子節點存儲的是主鍵值?

非主鍵索引結構葉子節點存儲主鍵值的原因主要有兩個:

  • 保持一致性:當數據庫表進行DML(數據操縱語言,如INSERT、UPDATE、DELETE)操作時,同一行記錄的頁地址可能會發生改變。由于非主鍵索引保存的是主鍵的值,而非實際的數據記錄,因此當數據記錄發生移動或變更時,非主鍵索引無需進行更改,只需保持與主鍵值的對應關系即可,從而保持索引的一致性。
  • 節省存儲空間:在InnoDB存儲引擎中,數據本身已經按照主鍵索引的B+樹結構進行存儲。如果非主鍵索引也存儲整行數據,那么每個非主鍵索引都會存儲一份數據,這將導致大量的數據冗余和存儲空間的浪費。而只存儲主鍵值的方式可以極大地節省存儲空間,因為主鍵索引已經包含了完整的數據記錄。

非主鍵索引通過存儲主鍵值,可以在查詢時通過主鍵值快速定位到數據記錄所在的位置,從而提高查詢效率。

為什么非主鍵索引結構葉子節點存儲的是主鍵值?

為什么非主鍵索引結構葉子節點存儲的是主鍵值?為什么非主鍵索引結構葉子節點存儲的是主鍵值?先用二級索引找到主鍵索引,然后使用主鍵索引回表去查詢對應的數據。

📙MySQL最左前綴優化原則是怎么回事

MySQL最左前綴優化原則

  • 先對比name大小,比較字符大小,HanMeimei<Jeff
  • 然后對比age大小,比較年齡大小,30<31<32
  • 最后對比position大小,dev<manager
EXPLAIN SELECT * FROM employees WHERE name = 'Bill' and age = 31;
EXPLAIN SELECT * FROM employees WHERE age = 30 AND position = 'dev';
EXPLAIN SELECT * FROM employees WHERE position = 'manager';|

根據上述的聯合索引,分析上述SQL,只有第一條SQL會走索引。

  • 聯合索引遵循最左前綴原則,先使用name進行查找,這是name已經排好序了,直接可以查詢。
  • 然后使用age去查找,發現30,31,32,28,22,30,30,這個是沒有排序的,就走全表掃描了。
  • 后面就不會使用position繼續查找了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13430.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13430.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13430.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言如何創建?個動態鏈表?

一、問題 創建動態鏈表就是指在程序執?過程中&#xff0c;從?到有&#xff0c;按照需求開辟結點和輸?各結點數據&#xff0c;并建?起前后相連接的關系。那么&#xff0c;如何創建動態鏈表呢&#xff1f; 二、解答 以建??個有任意名學?數據的單向動態鏈表為例&#xff0…

使用mysql主從熱備+keepalived服務+ipvsadm工具 實現 mysql高可用主備+負載均衡

目錄 1、工作原理 2、環境準備 3、分別在主服務器和備用服務器上安裝keepalived和ipvsadm 4、修改keepalived服務的配置文件 4.1 修改主服務器上的keepalive服務的配置文件 4.2 修改備用服務器上的keepalive服務配置文件 5、編寫mysql監控腳本放到主服務器上 6、在主服…

echers配置項:X軸,Y軸顏色修改

如上圖綠框所示&#xff0c;修改x&#xff0c;y軸的顏色 let option {xAxis: {axisLine:{lineStyle:{color:red}},},yAxis: {type: value,axisLine:{lineStyle:{color:red}},}, }

學習MySQL(六):Python的連接與操作

安裝第三方模塊pymysql pip install pymysql 或者 通過PyCharm后臺操作 連接mysql # 語法示例 import pymysql db pymysql.connect(hostlocalhost,userroot,password"123456",databaseschool,port3306,charset"utf8") 數據操作的基本語法 import pymys…

通過gen_compile_commands.py產生compile_commands.json文件的方法

大家在使用vscode查看linux源代碼時&#xff0c;會有很多飄紅處&#xff0c;而且函數的跳轉非常不方便。所以linux給了一個腳本gen_compile_commands.py&#xff0c;此腳本類似ctags這樣&#xff0c;產生相應的關聯之類的數據庫&#xff0c;方便函數及文件的跳轉等等。非常好。…

軟件測試委托合同(Word原件實際參考)

一、 任務表述 二、雙方的主要義務 三、履約地點 四、合同價款 五、測試費用支付方式 六、履行的期限 七、資料的保密 八、 風險責任的承擔 九、驗收方法 十、 爭議解決 十一、 其他 十二、簽章 十三、計算機軟件產品鑒定測試保密協議 軟件資料清單列表部分文檔&#xff1a; …

Object.wait()和LockSupport.park()

Object.wait() 和 LockSupport.park() 都是用來使當前線程等待的方法&#xff0c;但它們在使用場景和機制上有所不同&#xff1a; Object.wait() 用途&#xff1a;wait() 方法屬于對象監視器&#xff08;Monitor&#xff09;的一部分&#xff0c;通常與 synchronized 塊或方法…

電感式傳感器

電感傳感器是基于電磁感應原理&#xff0c;將被測非電量&#xff08;如位移、壓力、振動等&#xff09;轉換為電感量變化的一種結構性傳感器。利用自感原理的有自感式傳感器&#xff08;可變磁阻式&#xff09;&#xff0c;利用互感原理的有互感式&#xff08;差動變壓器式和渦…

AI學習指南線性代數篇-矩陣的運算

AI學習指南線性代數篇-矩陣的運算 線性代數中&#xff0c;矩陣的運算是一項重要而基礎的內容。在人工智能領域&#xff0c;矩陣的運算被廣泛應用于各種算法中&#xff0c;如神經網絡、圖像處理、自然語言處理等。本文將從矩陣的運算概述、在AI中的使用場景、定義和意義以及公式…

QT:QML制作線形圖

目錄 一.介紹 二.引入庫 三.自定義屬性 四.懸停處理函數 五.設置X軸 六.設置Y軸 七.畫線 八.測試點坐標 九.設置值 十.效果演示 十一.代碼演示 1.LineGraph.qml 2.main.qml 一.介紹 線形圖&#xff08;也稱為折線圖&#xff09;是一種常用的數據可視化工具&#…

如何找到MySQL中存儲引擎所對應的表空間并且打開?

在上節課我們學習了數據庫&#xff08;MySQL&#xff09;進階&#xff1a;存儲引擎&#xff0c;有不少同學產生疑惑&#xff0c;到底要怎么找到表空間并且打開啊&#xff1f;這節課我們就來探討。 首先&#xff0c;根據這個路徑&#xff1a;C:\ProgramData\MySQL\MySQL Server…

mybatis-plus如何使用QueryWrapper和LambdaQueryWrapper的and方法?

構造器去構造條件的時候&#xff0c;我們都知道eq方法去鏈式的時候是自動添加and的&#xff0c;那如果需要and的那個條件需要加括號呢&#xff1f; 環境 Jdk 1.8、mybatis-plus 3.5.3.2、mysql 5.7.11 示例 sql&#xff1a; select * from user where openid 1 and (phon…

谷歌Flank潛藏3年的Github Action供應鏈攻擊

01 簡 介 Flank [1] 是谷歌 Firebase Test lab 開源在 Github 的一個項目&#xff0c;用于同時對多個安卓和IOS設備進行測試。2024年4月15號 AWS 安全工程師 Adnan Khan 公布了關于該項目代碼倉庫 Github Action CI/CD 存在漏洞的細節[2]&#xff0c;漏洞在2020年于此 代碼合…

通信網絡時鐘同步(PTP網絡授時服務器)技術探討

通信網絡時鐘同步&#xff08;NTP網絡授時服務器&#xff09;技術探討 通信網絡時鐘同步&#xff08;NTP網絡授時服務器&#xff09;技術探討 1、著移動通信業務的發展和移動用戶的快速增長&#xff0c; 移動網絡架構向IP化、寬帶化進展。為了適應業務IP化發展趨勢&#xff0c…

02 VUE學習:模板語法

模板語法 Vue 使用一種基于 HTML 的模板語法&#xff0c;使我們能夠聲明式地將其組件實例的數據綁定到呈現的 DOM 上。所有的 Vue 模板都是語法層面合法的 HTML&#xff0c;可以被符合規范的瀏覽器和 HTML 解析器解析。 在底層機制中&#xff0c;Vue 會將模板編譯成高度優化的…

開發vue3,真的可以不用ref/reactive了,也不需要ref.value

什么是Cabloy-Front&#xff1f; Cabloy-Front 是一款支持 IOC 容器的 Vue3 框架。不用ref/reactive&#xff0c;不用ref.value&#xff0c;不用pinia 與UI庫的配合 Cabloy-Front 可以搭配任何 UI 庫使用&#xff0c;并且內置了幾款 UI 庫的項目模版&#xff0c;便于開箱即用…

免費SSL證書簽發安裝指南

一、簽發 1.選擇證書頒發機構&#xff08;CA&#xff09;&#xff1a;首先&#xff0c;你需要找到一個提供免費SSL證書的CA。有些CA會提供永久免費的SSL證書&#xff0c;而有些則可能只提供有限時間的試用證書&#xff0c;如JoySSL就提供永久免費證書。 2.生成CSR&#xff08…

WPF 鼠標拖拽平移

效果 xaml <ScrollViewer x:Name"scrollViewer" HorizontalScrollBarVisibility"Hidden" VerticalScrollBarVisibility"Disabled" Background"#FFF1ADAD"PreviewMouseDown"ScrollViewer_OnPreviewMouseDown"PreviewMou…

Electron學習筆記(一)

文章目錄 相關筆記筆記說明 一、輕松入門 1、搭建開發環境2、創建窗口界面3、調試主進程 二、主進程和渲染進程1、進程互訪2、渲染進程訪問主進程類型3、渲染進程訪問主進程自定義內容4、渲染進程向主進程發送消息5、主進程向渲染進程發送消息6、多個窗口的渲染進程接收主進程發…

白鯨開源CEO郭煒在2024 DataOps發展大會上獲聘專家

2024年5月15日&#xff0c;白鯨開源CEO郭煒在2024 DataOps發展大會上被正式聘任為DataOps專家&#xff0c;并獲得了榮譽證書。本次大會由中國通信標準化協會主辦&#xff0c;中關村科學城管委會提供支持&#xff0c;大數據技術標準推進委員會&#xff08;CCSATC601&#xff09;…