MySQL:从B树到B+树到索引再到存储引擎
后端接口如何提高性能?
16 個寫代碼的好習慣
為什么不推薦使用BeanUtils屬性轉換工具
盤點阿里巴巴 34 個牛逼 GitHub 項目
常見代碼重構技巧(非常實用)
來源:blog.csdn.net/that_is_cool/article/details/81069945
索引其實是一種數據結構,在數據庫中,讀寫的比例是在10:1,所以如果每一次查找都全表查找的話,效率將會變的十分的低下。所以,本文將會按照題目,按部就班地講解MySql的索引。
##B樹和B+樹 B樹和B+樹算是數據結構中出現頻率十分高的模型了,在筆者之前的幾篇博客,有對二叉查找樹和二叉平衡樹進行過講解和代碼分析,但是那些都是在程序中使用比較多的樹,在數據庫中,數據量相對較大,多路查找樹顯然更加適合數據庫的應用場景,接下來我們就介紹這兩類多路查找樹,畢竟作為程序員,心里沒點B樹怎么能行呢?
B樹:B樹就是B-樹,他有著如下的特性:
B樹不同于二叉樹,他們的一個節點可以存儲多個關鍵字和多個子樹指針,這也是B+樹的特點;
一個m階的B樹要求除了根節點以外,所有的非葉子子節點必須要有[m/2,m]個子樹;
根節點必須只能有兩個子樹,當然,如果只有根節點一個節點的情況存在;
B樹是一個查找二叉樹,這點和二叉查找樹很像,他都是越靠前的子樹越小,并且,同一個節點內,關鍵字按照大小排序;
B樹的一個節點要求子樹的個數等于關鍵字的個數+1;
好了,話不多說,看看B樹的模型吧:
一個五階的B樹由于B樹將所有的查找關鍵字都放在節點中,所以查找方式和二叉查找十分相像,比如說查找E:
先通過根節點找到了左子樹,再順序地遍歷左子樹,發現E在F和J的中間,于是查找葉子節點,順序遍歷關鍵字以后就可以返回E了,如果未能查到E,則表示沒有找到。
B+樹
人人都喜歡plus,B+樹就是這么一個plus,后頭所講解的索引,就是用的B+樹,我們先來看看他的特性吧:
B+樹將所有的查找結果放在葉子節點中,這也就意味著查找B+樹,就必須到葉子節點才能返回結果;
B+樹每一個節點的關鍵字個數和子樹指針個數相同;
B+樹的非葉子節點的每一個關鍵字對應一個指針,而關鍵字則是子樹的最大,或者最小值;
看看模型吧:
一個3階的B+樹他的查找方式也是簡單粗暴的,和B樹十分像,只不過他會在葉子節點中找到目標,比如我們找兔:
第一步比馬小,就會查找他的子樹,第二部比龍小,就會查找他的子樹,最后在葉子節點中的關鍵字命中目標。
那么MySql是如何利用這數據結構的呢?
MySql中的兩種常見存儲引擎
MySql當然不止兩種搜索引擎了,但是本次我們說的B+樹索引,為接下來這兩種存儲引擎所用,一個是Innodb,一個Myisam。(搜索公眾號Java知音,回復“2021”,送你一份Java面試題寶典)
Innodb存儲引擎
Innodb使用的是B+樹,他存在有一個主鍵索引和輔助索引兩種索引,主鍵索引是在生成主鍵時就有的索引,他的葉子節點中存放的就是數據行,所以又稱之為聚集索引。
而另一類索引,輔助索引,就是我們人為新建的索引,他的葉子節點中存放的是主鍵,當我們通過輔助索引查找到主鍵之后,再通過查找的主鍵去查找主鍵索引,我們看看兩種索引的結構吧:
innodb主索引,其中葉子中存放的就是數據行innodb輔助索引,其中葉子存放的是主鍵MyIsam存儲引擎
很顯然,MyIsam不可能再會用聚集索引了,雖然他用的是B+樹,但是他的主鍵索引和輔助索引沒有任何區別,都是在葉子中存儲數據行的物理地址,這也使得他的讀性能更高,我們來看他的模型吧:
MyIsam存儲引擎的主鍵索引MyIsam存儲引擎的輔助索引,存放的同樣是物理地址區別
1、innodb支持事務,且默認是Autocommit,所以每一條SQL語句都會封裝成一個事務,如果執行多條事務,最好加上begin和commit。MyIsam不支持事務,也就無法回滾;
2、另外Innodb支持行鎖,MyIsam進行寫操作會全表上鎖,所以MyIsam的寫操作性能會差些;
3、所以,在查詢較多的表中,使用MyIsam較優,寫比較多的表,使用Innodb;
拓展--復合索引
我們都知道我們可以對一個列創建一個索引,但是什么是復合索引呢?
創建:
create?table?test( a?int, b?int, c?int, KEY?a(a,b,c) );通過以上代碼我們就可以創建一個a、b、c三個字段的復合索引了,相對于維護三個索引,維護一個復合索引的開銷肯定是更低的。
但是復合索引需要滿足一個最左匹配原則,也就是他會依次查找a、b、c三個字段,當左邊的字段未作為判斷條件時,就不會再去執行接下來的索引了,測試如下:
EXPLAIN?DELETE?from?test where??a=1?and?c=?3?and?b?=2? 當a、b、c都有的時候,他會繼續去匹配右邊的字段EXPLAIN?DELETE?from?test where??a=1?and?c=?3? 當去除b時,發現復合索引只匹配到a就結束了,并不會匹配c推薦文章14個項目!
一款小清新的 SpringBoot+ Mybatis 前后端分離后臺管理系統項目
47K Star 的SpringBoot+MyBatis+docker電商項目,附帶超詳細的文檔!
寫博客能月入10K?
一款基于 Spring Boot 的現代化社區(論壇/問答/社交網絡/博客)
這或許是最美的Vue+Element開源后臺管理UI
推薦一款高顏值的 Spring Boot 快速開發框架
一款基于 Spring Boot 的現代化社區(論壇/問答/社交網絡/博客)
13K點贊都基于 Vue+Spring 前后端分離管理系統ELAdmin,大愛
想接私活時薪再翻一倍,建議根據這幾個開源的SpringBoot
總結
以上是生活随笔為你收集整理的MySQL:从B树到B+树到索引再到存储引擎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大佬把Spring框架总结的「无比详细」
- 下一篇: 分享一个在线考试系统,练手项目用他很香