如果用樹作為索引的資料結構,每查找一次資料就會從磁碟中讀取樹的一個節點,也就是一頁,而二元樹的每個節點只儲存一條數據,並不能填滿一頁的儲存空間,那多餘的儲存空間豈不是要浪費了?為了解決一個二元平衡搜尋樹的這個弊端,我們應該尋找一個單一節點可以儲存更多資料的資料結構,也就是多路搜尋樹。
1. 多路搜尋樹
1、完全二元樹高度:O(log2N)
,其中2為對數,樹每層的節點數;
2、完全M路搜尋樹的高度:O(logmN)
,其中M為對數,樹每層的節點數;
M路搜尋樹適用於儲存資料量過大無法一次載入到記憶體的場景。透過增加每層節點的數量和在每個節點存放更多的數據來在一層中存放更多的數據,從而降低樹的高度,在數據查找時減少磁碟存取次數。
因此,如果每個節點包含的關鍵字數量和每層的節點數量增加,則樹的高度將減少。儘管每個節點的資料確定會更加耗時,但B樹的關注點在於解決磁碟效能瓶頸,因此單一節點搜尋資料的成本可以被忽略。
2. B樹-多路平衡搜尋樹
B樹是一種M路搜尋樹,B樹主要用於解決M路搜尋樹的不平衡導致樹的高度變高,跟二元樹退化為鍊錶導致效能問題一樣。 B樹透過對每層的節點進行控制、調整,如節點分離,節點合併,一層滿時向上分裂父節點來增加新的層等操作來確保該M路搜索樹的平衡。
在B樹中,每個節點都是一個磁碟區塊(頁),而階數或說路數M則規定了節點中最多的子節點數量。每個非葉子節點存放了關鍵字和指向兒子樹的指針,具體數量為:M階的B樹,每個非葉子節點存放了M-1個關鍵字和M個指向子樹的指針。如圖為5階B樹結構的示意圖:
3. B樹索引
先建立一個user表:
create table user( id int, name varchar, primary key(id) ) ROW_FORMAT=COMPACT;
假如我們使用B樹對錶中的使用者記錄建立索引:
B樹的每個節點佔用一個磁碟區塊,磁碟區塊也就是頁,從上圖可以看出,B樹相對於平衡二元樹,每個節點儲存了更多的主鍵key和資料data,並且每個節點擁有了更多的子節點,子節點的個數一般稱為階,上述圖中的B樹為3階B樹,高度也會降低。假如我們要找id=28
的用戶訊息,那麼查找流程如下:
#1、根據根節點找到頁1,讀入記憶體。 【磁碟I/O操作第1次】
2、比較鍵值28在區間(17,35),找到頁1的指標p2;
3、根據p2指標找到頁3,讀入記憶體。 【磁碟I/O操作第2次】
4、比較鍵值28在區間(26,35),找到頁3的指標p2。
5、根據p2指標找到頁8,讀入記憶體。 【磁碟I/O操作第3次】
6、在頁8中的鍵值清單中找到鍵值28,鍵值對應的使用者資訊為(28,po);
B-Tree
相對於AVLTree
縮減了節點個數,使每次磁碟I/O取到記憶體的資料都發揮了作用,從而提高了查詢效率。
4. B 樹索引
B Tree是在B-Tree基礎上的一種最佳化,使其更適合實現外部儲存索引結構,B 樹的性質:
1、非葉子節點的子樹指標與關鍵字個數相同;
2、為所有葉子節點增加一個鏈結指標;
3、所有關鍵字都在葉子節點出現, 且鍊錶中的關鍵字恰好是有序的;
4、非葉子節點相當於是葉子節點的索引,葉子節點相當於是儲存(關鍵字)資料的資料層;
InnoDB儲存引擎就是用B Tree實現其索引結構。
B-樹結構圖中可見每個節點除了資料的key值外,還包含資料值。而每一個頁的儲存空間是有限的,如果data資料較大時將會導致每個節點(即一個頁)能儲存的key的數量很小,當儲存的資料量很大時同樣會導致B- Tree的深度較大,增加查詢時的磁碟I/O次數,進而影響查詢效率。在B Tree中,所有資料記錄節點都是按照鍵值大小順序存放在同一層的葉子節點上,而非葉子節點上只存儲key值信息,這樣可以大大加大每個節點存儲的key值數量,降低B Tree的高度。
B Tree相對於B-Tree有幾點不同:
#1、非葉子節點只儲存鍵值資訊和指向子節點頁號的指標;
2、所有葉子節點之間都有一個鏈指標;
3、資料記錄都存放在葉子節點中;
根據上圖我們來看下B 樹和B 樹有什麼不同:
(2) 在B 樹中,非葉節點僅儲存鍵值,而B樹節點既儲存鍵值,也儲存資料。
頁的大小是固定的,InnoDB 中頁的預設大小是 16KB。如果不儲存數據,那麼就會儲存更多的鍵值,相應的樹的階數就會更大,樹就會更矮更胖,如此一來我們查找數據進行磁碟的IO 次數又會再次減少,資料查詢的效率也會更快。
另外,如果我們的 B 樹一個節點可以儲存 1000 個鍵值,那麼 3 層 B 樹可以儲存 1000×1000×1000=10 億個資料。一般根節點是常駐記憶體的(第一次檢索根節點不用讀取磁碟),所以一般我們查找 10 億數據,只需要 2 次磁碟 IO。
(2) B 樹索引的所有資料都儲存在葉子節點,而且資料是按照順序排列的。
B 樹中各個頁之間是透過雙向鍊錶連接的,葉子節點中的資料是透過單向鍊錶連接的,透過這種方式可以找到表中的所有資料。 B 樹讓範圍查詢、排序查詢、分組查詢和去重查詢變得極為簡單。而 B 樹因為資料分散在各個節點,要實現這一點是很不容易的。
以上是MySQL中B樹索引和B+樹索引的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

MySQL索引基数对查询性能有显著影响:1.高基数索引能更有效地缩小数据范围,提高查询效率;2.低基数索引可能导致全表扫描,降低查询性能;3.在联合索引中,应将高基数列放在前面以优化查询。

MySQL學習路徑包括基礎知識、核心概念、使用示例和優化技巧。 1)了解表、行、列、SQL查詢等基礎概念。 2)學習MySQL的定義、工作原理和優勢。 3)掌握基本CRUD操作和高級用法,如索引和存儲過程。 4)熟悉常見錯誤調試和性能優化建議,如合理使用索引和優化查詢。通過這些步驟,你將全面掌握MySQL的使用和優化。

MySQL在現實世界的應用包括基礎數據庫設計和復雜查詢優化。 1)基本用法:用於存儲和管理用戶數據,如插入、查詢、更新和刪除用戶信息。 2)高級用法:處理複雜業務邏輯,如電子商務平台的訂單和庫存管理。 3)性能優化:通過合理使用索引、分區表和查詢緩存來提升性能。

MySQL中的SQL命令可以分為DDL、DML、DQL、DCL等類別,用於創建、修改、刪除數據庫和表,插入、更新、刪除數據,以及執行複雜的查詢操作。 1.基本用法包括CREATETABLE創建表、INSERTINTO插入數據和SELECT查詢數據。 2.高級用法涉及JOIN進行表聯接、子查詢和GROUPBY進行數據聚合。 3.常見錯誤如語法錯誤、數據類型不匹配和權限問題可以通過語法檢查、數據類型轉換和權限管理來調試。 4.性能優化建議包括使用索引、避免全表掃描、優化JOIN操作和使用事務來保證數據一致性

InnoDB通過undolog實現原子性,通過鎖機制和MVCC實現一致性和隔離性,通過redolog實現持久性。 1)原子性:使用undolog記錄原始數據,確保事務可回滾。 2)一致性:通過行級鎖和MVCC確保數據一致。 3)隔離性:支持多種隔離級別,默認使用REPEATABLEREAD。 4)持久性:使用redolog記錄修改,確保數據持久保存。

MySQL在數據庫和編程中的地位非常重要,它是一個開源的關係型數據庫管理系統,廣泛應用於各種應用場景。 1)MySQL提供高效的數據存儲、組織和檢索功能,支持Web、移動和企業級系統。 2)它使用客戶端-服務器架構,支持多種存儲引擎和索引優化。 3)基本用法包括創建表和插入數據,高級用法涉及多表JOIN和復雜查詢。 4)常見問題如SQL語法錯誤和性能問題可以通過EXPLAIN命令和慢查詢日誌調試。 5)性能優化方法包括合理使用索引、優化查詢和使用緩存,最佳實踐包括使用事務和PreparedStatemen

MySQL適合小型和大型企業。 1)小型企業可使用MySQL進行基本數據管理,如存儲客戶信息。 2)大型企業可利用MySQL處理海量數據和復雜業務邏輯,優化查詢性能和事務處理。

InnoDB通過Next-KeyLocking機制有效防止幻讀。 1)Next-KeyLocking結合行鎖和間隙鎖,鎖定記錄及其間隙,防止新記錄插入。 2)在實際應用中,通過優化查詢和調整隔離級別,可以減少鎖競爭,提高並發性能。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3 Linux新版
SublimeText3 Linux最新版

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。