看了很多講B樹和B+樹的文章,大多都是圍繞各自的特性講的,第一,樹中每個結點最多含有m個孩子(m>=2);第二,……我也是從這些文章里弄懂了各種樹的聯繫與區別,要真寫,我可能還不如人家寫得好。所以就在這裡簡明扼要的用幾張圖記錄一下主要區別吧。
為了便於說明,我們先定義一條數據記錄為一個二元組[key,data],key為記錄的鍵值,key唯一;data為數據記錄除key外的數據。
B樹
每個節點都存儲key和data,所有節點組成這棵樹,並且葉子節點指針為null。
B+樹
只有葉子節點存儲data,葉子節點包含了這棵樹的所有鍵值,葉子節點不存儲指針。
後來,在B+樹上增加了順序訪問指針,也就是每個葉子節點增加一個指向相鄰葉子節點的指針,這樣一棵樹成了數據庫系統實現索引的首選數據結構。
原因有很多,最主要的是這棵樹矮胖,呵呵。一般來說,索引很大,往往以索引文件的形式存儲的磁盤上,索引查找時產生磁盤I/O消耗,相對於內存存取,I/O存取的消耗要高几個數量級,所以評價一個數據結構作為索引的優劣最重要的指標就是在查找過程中磁盤I/O操作次數的時間複雜度。樹高度越小,I/O次數越少。
那為什麼是B+樹而不是B樹呢,因為它內節點不存儲data,這樣一個節點就可以存儲更多的key。
在MySQL中,最常用的兩個存儲引擎是MyISAM和InnoDB,它們對索引的實現方式是不同的。
MyISAM
data存的是數據地址。索引是索引,數據是數據。
InnoDB
data存的是數據本身。索引也是數據。
瞭解了數據結構再看索引,一切都不費解了,只是順著邏輯推而已。另加兩種存儲引擎的區別:
1、MyISAM是非事務安全的,而InnoDB是事務安全的
2、MyISAM鎖的粒度是表級的,而InnoDB支持行級鎖
3、MyISAM支持全文類型索引,而InnoDB不支持全文索引
4、MyISAM相對簡單,效率上要優於InnoDB,小型應用可以考慮使用MyISAM
5、MyISAM表保存成文件形式,跨平臺使用更加方便
6、MyISAM管理非事務表,提供高速存儲和檢索以及全文搜索能力,如果在應用中執行大量select操作可選擇
7、InnoDB用於事務處理,具有ACID事務支持等特性,如果在應用中執行大量insert和update操作,可選擇。
原文:https://blog.csdn.net/zhuanzhe117/article/details/78039692
閱讀更多 cpp軟件架構獅 的文章