为什么用B+树做索引MySQL存储引擎简介
索引的數據結構
為什么不是二叉樹,紅黑樹什么的呢?
首先,一般來說,索引本身也很大,不可能全部存在內存中,因此索引往往以索引文件的方式存在磁盤上。然后一般一個結點一個磁盤塊,也就是讀一個結點要進行一次IO操作。
而二叉樹啊這些樹類的數據結構,查找時間主要和樹的高度有關,所以雖然一顆AVL樹或者是紅黑樹在查找上比起順序遍歷的O(N)有了比較大的改善,但B樹和B+樹因為每個結點存的元素更多,所以查詢更快,對磁盤的IO操作也更少。
?
?
為什么是B+樹而不是B樹呢?
1. 單一節點存儲更多的元素(這樣該節點下分支變多了,樹變矮胖了),使得查詢的IO次數更少。
B+樹真正的數據都存在葉子結點嘛,也就是上面的結點就簡單的索引,就內存會更小,意味著同樣的一個頁內存大小,所以B+樹中,同樣的磁盤頁大小可以裝更多個“索引”,也就是在同樣的數據量的情況下,B+樹會比B樹更加矮胖,因此查詢時IO的次數也更加少。
?
2. 所有查詢都要查找到葉子節點,查詢性能穩定。
B+樹的查詢必須查到葉子結點,因為它真正的數據都在葉子嘛,而B樹不是,B樹只要匹配到那個索引data就好,無論它是在中間結點還是葉子結點,因此B樹的查詢不是穩定的,最好的情況是只找根節點就行,最壞的情況是找到葉子結點,而B+樹的每次查找都是穩定的。
?
3. 所有葉子節點形成有序鏈表,便于范圍查詢。
B樹的范圍查詢十分麻煩,B+樹的范圍查詢只需要在最下面的葉子結點的鏈表中做遍歷就行。
?
?
?
關于MySQL存儲引擎的簡單介紹(全都復制粘貼的)
存儲引擎?
定義:
數據庫引擎是用于存儲、處理和保護數據的核心服務。利用數據庫引擎可控制訪問權限并快速處理事務,從而滿足企業內大多數需要處理大量數據的應用程序的要求。 使用數據庫引擎創建用于聯機事務處理或聯機分析處理數據的關系數據庫。這包括創建用于存儲數據的表和用于查看、管理和保護數據安全的數據庫對象(如索引、視圖和存儲過程)。
存儲引擎作用:
1)設計并創建數據庫以保存系統所需的關系或XML文檔。
2)實現系統以訪問和更改數據庫中存儲的數據。包括實現網站或使用數據的應用程序,還包括生成使用SQL Server工具和實用工具以使用數據的過程。
3)為單位或客戶部署實現的系統。
4)提供日常管理支持以優化數據庫的性能。
?
?
?
Innodb和MyIASM
1.簡單介紹這兩種引擎,以及該如何去選擇。
2.這兩種引擎所使用的數據結構是什么。
1.怎么選擇
a.Innodb引擎,Innodb引擎提供了對數據庫ACID事務的支持。并且還提供了行級鎖和外鍵的約束。它的設計的目標就是處理大數據容量的數據庫系統。它本身實際上是基于Mysql后臺的完整的系統。Mysql運行的時候,Innodb會在內存中建立緩沖池,用于緩沖數據和索引。但是,該引擎是不支持全文搜索的。同時,啟動也比較的慢,它是不會保存表的行數的。當進行Select count(*) from table指令的時候,需要進行掃描全表。所以當需要使用數據庫的事務時,該引擎就是首選。由于鎖的粒度小,寫操作是不會鎖定全表的。所以在并發度較高的場景下使用會提升效率的。
b.MyIASM引擎,它是MySql的默認引擎,但不提供事務的支持,也不支持行級鎖和外鍵。因此當執行Insert插入和Update更新語句時,即執行寫操作的時候需要鎖定這個表。所以會導致效率會降低。不過和Innodb不同的是,MyIASM引擎是保存了表的行數,于是當進行Select count(*) from table語句時,可以直接的讀取已經保存的值而不需要進行掃描全表。所以,如果表的讀操作遠遠多于寫操作時,并且不需要事務的支持的。可以將MyIASM作為數據庫引擎的首先。
補充2點:
c.大容量的數據集時趨向于選擇Innodb。因為它支持事務處理和故障的恢復。Innodb可以利用數據日志來進行數據的恢復。主鍵的查詢在Innodb也是比較快的。
d.大批量的插入語句時(這里是INSERT語句)在MyIASM引擎中執行的比較的快,但是UPDATE語句在Innodb下執行的會比較的快,尤其是在并發量大的時候。
?
2.兩種引擎所使用的索引的數據結構是什么?
答案:都是B+樹!
MyIASM引擎,B+樹的數據結構中存儲的內容實際上是實際數據的地址值。也就是說它的索引和實際數據是分開的,只不過使用索引指向了實際數據。這種索引的模式被稱為非聚集索引。
Innodb引擎的索引的數據結構也是B+樹,只不過數據結構中存儲的都是實際的數據,這種索引有被稱為聚集索引。
下面的內容再詳細地介紹下這兩種引擎中的索引機制
?
?
聚簇索引和非聚簇索引
先是InnoDB下的索引機制。
1. Innodb中的聚簇索引
在InnoDb中,用的就是聚簇索引,而且會默認為主鍵設置聚簇索引 ,Innodb通過主鍵聚集數據,如果沒有定義主鍵,innodb會選擇非空的唯一索引代替。如果沒有這樣的索引,innodb會隱式的定義一個主鍵來作為聚簇索引。
所謂聚簇索引,就是索引的邏輯順序和數據的物理順序是一致的,就像字典,你想找“怕”字,你會直接翻到字母“p”的位置開始找。innodb中的主鍵索引也就是主索引就是這樣的機制,它的數據就在主索引的B+樹的葉子節點 上:
?
聚簇索引的優點:
聚簇索引的缺點:
?
2. Innodb中的輔助索引
這里的輔助索引指的是不是建立在主鍵,或者說是聚簇索引的所在列的索引。這些索引的B+樹中的葉子節點存的是該屬性所對應的row的主鍵值。然后再通過這個主鍵值去主鍵索引的B+樹中去找那個row。所以有時候也叫二次索引,就是建立在主聚簇索引上的索引,要二次搜索。
?
?
MyISAM下的索引機制
而在MyISAM中,MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址!!
所以在MyISAM中,主索引和所謂是輔助索引,是一樣的。
1. 主鍵索引:
MyISAM引擎使用B+Tree作為索引結構,葉節點的data域存放的是數據記錄的地址。下圖是MyISAM主鍵索引的原理圖:
?
這里設表一共有三列,假設我們以Col1為主鍵,圖myisam1是一個MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件僅僅保存數據記錄的地址。
?
2. 輔助索引(Secondary key):
在MyISAM中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重復。如果我們在Col2上建立一個輔助索引,則此索引的結構如下圖所示:
同樣也是一顆B+Tree,data域保存數據記錄的地址。因此,MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應數據記錄。
?
?
?
?
用一張圖總結下這兩個引擎中的索引機制:
?
?
參考文章:
https://blog.csdn.net/qq_35571554/article/details/82759668——《漫畫敘述B+樹和B-樹,很值得看!》分析為什么是B+而不是B樹,生動形象
https://www.cnblogs.com/sunsky303/p/8274586.html——《mysql各種引擎對比、實戰?》這篇文章介紹了存儲引擎的概念
https://www.cnblogs.com/xiaohaillong/p/6079551.html——《mysql的常用引擎?》,分析Innodb和MyIASM兩個引擎
https://blog.csdn.net/lm1060891265/article/details/81482136——《聚簇索引和非聚簇索引》內容是蠻齊全的,就是寫得很亂……
?
轉載于:https://www.cnblogs.com/wangshen31/p/10519557.html
總結
以上是生活随笔為你收集整理的为什么用B+树做索引MySQL存储引擎简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络第七版(谢希仁著)课后习题答案
- 下一篇: npm: 权限阻止修复