数据库的存储结构

B树和B+树主要用于构建磁盘中的高速索引,比如文件系统和数据库。

数据库中数据的储存主要有两种方式,一种是行存储,一种是列存储。

行存储,就是数据库中的一行数据存储在一段连续的磁盘块上。同理,列存储,就是一列数据存储在一起。

行存储的优点就是,单挑记录集中,适合事务。缺点是,聚合查询慢。因为聚合涉及多条行记录,那么就要从磁盘的多个非连续的块中读取数据。多次IO访问,导致查询慢。

列存储的有点是,聚合查询快,聚合计算快。因为它的列数据是放在一起的,IO读取一次或几次,就能把数据加载到内存。缺点也很明显,不适合事务。如果要更新每张表中的几个字段,那么就要读写几次磁盘,因为这些字段的数据不是连续存储的。那更新的时候,在单机环境,我们可以上锁,用内存屏障,但是在分布式环境下想保持一致性,就很难搞,开销非常大。

索引是对数据库表中一个或多个列(如student表的姓名 (name) 列)的值进行排序的结构,d独立于表的结构,方便快速查找定位数据。我们知道二分查找非常快,但前提是数据排序好的。如果直接索引直接利用表中的某一列数据,那么在往表中插入数据的时候,为了保持顺序一致,我们就要移动其他数据,这样开销就会很大。

索引的数据结构

二叉搜索树,有的是查找效率高,缺点不适合磁盘查找,还是那个老瓶颈,因为二叉搜索树的太高了,越高访问磁盘的次数就阅读,而磁盘的访问速度(准确讲是寻道速度)太慢了。所以,在二叉搜索树记性改进,降低树高,成为一个研究的方向,也由此诞生了B树和B+树。

B树,降低了树高,节点多存储些数据。B 树的每个节点是一个索引条目(例如:一个 <订单 ID,序号> 的组合),如果是行数据库可以索引到一条存储在磁盘上的记录。如下图所示

 B+树,是对B树的改进。它只有叶子节点存储数据,其他节点只做查询。这样的好处是,牺牲了部分空间,也就是非叶子节点,但删除和插入效率大大提高了。删除的时候,往往只需要删除叶子节点就好了,非常快。不像B树,要进行非常复杂的变形。插入的话,B+树也最多只涉及树的一条路径。这里就很好的以空间换时间这种思想。

另一个方面,它的叶子节点之间用链表连接,这样就能很好的支持范围查找。当然B-Tree也很好的支持范围。HashMap,哈希表单条查找效率是非常高的,并且它不需要数据排序,但是这种数据结构,对于范围查找,聚合查找是不支持的,排序和模糊匹配也不支持。

MySQL中支持多种存储引擎,InnoDB引擎,用的就是B+树,在一些特定数据中,访问很频繁的行数据,可能会附加基于hashmap的引擎,不过这些都是MySQL内部做的事情了。

参考:

[0] 数据库索引

[1] 数据库文件系统实例:MySQL 中 B 树和 B+ 树有什么区别?

[2] 高性能MySQL

猜你喜欢

转载自blog.csdn.net/niu91/article/details/112298213