MYSQL: B树和B+树

B树(B, B-, B+)是多叉树, 不是二叉树。
B-tree中的“-”并不是“减”,而是连接符。
B+tree中的B代表平衡(balance),而不是二叉(binary)


树:所谓的树形结构就是各个元素之间具有分层关系的数据结构,常用一棵倒置的树来表示逻辑关系。
根节点:所谓的根节点就是树的最顶端的节点,
子节点:继续往下分为子节点,
叶子节点:当不断细分直到不再有子节点时为叶子节点。


B树和B+树的区别
1)B树的每个结点都存储了key和data,B+树的data存储在叶子节点上,节点不存储data,这样一个节点就可以存储更多的key。可以使得树更矮,所以IO操作次数更少。
2)树的所有叶子结点仅仅一层构成一个有序链表,可以按照关键码排序的次序遍历全部记录由于数据顺序排列并且相连,所以便于区间查找和搜索。
而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。


先定义一条数据记录为一个二元组[key,data],key为记录的键值,key唯一;data为数据记录除key外的数据。

B树
每个节点都存储key和data。
B+树
只有叶子节点存储data,叶子节点包含了这棵树的所有键值[key,data],叶子节点不存储指针。
后来,在B+树上增加了顺序访问指针,也就是每个叶子节点增加一个指向相邻叶子节点的指针,这样一棵树成了数据库系统实现索引的首选数据结构。


一般来说,索引很大,往往以索引文件的形式存储的磁盘上,索引查找时产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级。
所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的时间复杂度。
树高度越小,I/O次数越少, 而B+树是多叉树。 

那为什么是B+树而不是B树呢,因为它内节点不存储data,这样一个节点就可以存储更多的key。

 

MyISAM(索引和数据文件分离)
data存的是数据地址。索引是索引,数据是数据。索引放在XX.MYI文件中,数据放在XX.MYD文件中,所以也叫非聚集索引。
InnoDB(索引和数据文件不分离)
data存的是数据本身。索引也是数据。数据和索引存在一个XX.IDB文件中,所以也叫聚集索引。


两种存储引擎的区别:
1、MyISAM是非事务安全的,而InnoDB是事务安全的

2、MyISAM锁的粒度是表级的,而InnoDB支持行级锁

3、MyISAM支持全文类型索引,而InnoDB不支持全文索引

4、MyISAM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyISAM

5、MyISAM表保存成文件形式,跨平台使用更加方便

6、MyISAM管理非事务表,提供高速存储和检索以及全文搜索能力,如果在应用中执行大量select操作可选择

7、InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作可选择。

posted @ 2020-07-17 11:46  Adamanter  阅读(905)  评论(0)    收藏  举报