当前位置: 首页 > 科技观察

不同数据库存储引擎技术优缺点分析

时间:2023-03-13 07:41:13 科技观察

1.什么是数据库存储引擎技术什么是数据库存储引擎?主要解决什么问题?很多数据库管理员可能对存储引擎并不熟悉,因为大多数常见的关系型数据库基本上只有一种存储引擎,不给我们选择和设计的机会,比如Oracle和SQLServer。但是如果我们多接触MySQL和其他一些NoSQL分布式数据库,我们可能会对存储引擎有很深的感受。首先,我们认为存储引擎是一种数据存储和数据检索的解决方案。如何建立索引,如果更新,如何检索数据等都是它的功能。常见的存储引擎有哈希存储引擎和树存储引擎,树存储引擎分为B-Tree、B+Tree、LSM-Tree等几种。不同的存储引擎对数据结构、数据存储方式、数据读取方式都有不同的要求和特点。2、如何用不同的存储引擎建立索引2.1B-TreeB-tree数据结构实际上是我们在大学学习的数据结构课程中,在二叉树的基础上进行的升级和改进。它是由德国计算机科学家RudolfBayer等人首先提出的。在1972年的论文《Organization and Maintenance of Large Ordered Indexes》中。如图所示,B树实际上是一个平衡的多叉搜索树,也就是说最多可以开m个叉(m>=2),我们称它是一个m阶b树。一般来说,m阶B树满足以下条件:(1)每个节点最多可以有m个子树。(2)根节点,至少只有2个节点(极端情况下,一棵树只有一个根节点)。(3)非根非叶节点至少有Ceil(m/2)颗子树(图中5阶B树,每个节点至少有3颗子树)。(4)非叶子节点中的信息包括[n,A0,K1,...,Kn,An],其中n表示该节点存储的关键字个数,K为关键字,Ki(对应关系数据库中的信息,即二进制表中记录的主键信息)。(5)从根到叶子的每条路径长度都相同,即指向这些节点的指针为空。2.2B+TreeB+树其实是B-Tree的升级版,是在原有数据结构支持不足的基础上,经过一系列改造后形成的存储引擎技术,如图:如图,我们很容易直观的感受:B+树和B树最大的区别就是所有的数据记录都存储在叶子节点中,叶子节点有连接所有数据的指针。具体来说,B+树和B树的主要区别:(1)n个子树的节点包含n个关键词(有的也认为是n-1个关键词);(2)所有的叶子节点都包含了所有的Keywords,以及指向包含这些关键词的记录的指针,叶子节点本身也是按照从关键字从小到大的顺序连接起来的;(3)非叶子节点可以看作是索引部分,该节点只包含其子树中最大或最大的索引。最小的钥匙。由于采用了这样的结构,B+树与B树相比有以下两个优点:第一,由于索引节点上只有索引,没有数据,因此索引节点上可以存储比B树更多的索引,这样树高就会变矮。那么查询的时间复杂度会更低。另外,由于数据集中在叶子节点,叶子节点增加前后指针,指向同一父节点的相邻兄弟节点,为范围查询提供遍历。但是,如果使用B-tree结构,由于内部节点和叶子节点都可以存储数据,范围查询非常繁琐。2.3Hash存储引擎的数据库只是一个key-value存储系统。数据库中存储的数据是以文件的物理形式表示的,但每个物理文件中存储的具体数据内容主要包括两种:一种是主键,另一种是具体的数据值。用户通过put(key,value)写入数据,或者通过get(key)接口获取数据,每条记录都是一个键值对。有很多方法可以实现哈希索引本身。有基于静态散列的索引结构和基于动态散列的索引结构。具体实现方法取决于不同的数据库。一般来说,哈希索引表的结构如图:PK1→File-ID1Value-Lenth1Value-Position1Time-Stamp1PK2→File-ID2Value-Lenth2Value-Position2Time-Stamp2PK3→File-ID3Value-Lenth3Value-Position3Time-Stamp3PKn→File-ID4Value-Lenth4Value-Position4Time-Stamp4我们知道HashMap,通过K可以得到V。对于上面的哈希索引,PrimaryKey就是我们要得到的V值。例如(PK=keymod2)称为散列函数或散列函数,则PK的范围称为散列地址。存储时,通过哈希函数计算出哈希地址,然后存储value的值。查找时,通过哈希函数计算出哈希地址,然后读取数据。3.不同存储引擎的数据检索3.1B-Tree&B+Tree对于基于二叉树数据结构的树存储结构,查询数据的核心算法是二分查找算法,即通过key-value的比较排除一定比例的可能性,从而缩小数据查找的范围,通过多次比对最终定位到要查找的数据。直观表现时,我们还是以图为例:根据图,我们要找的数据是L。首先,将根节点的数据块从磁盘读入内存,读出P值,发现它小于P;然后,遍历根节点,节点左指针指向数据块,读出C、F、J、M值,顺序比较后找到J&M之间的指针;最后,遍历指向数据块的指针,读出K、L值,定位到查询到的数据L。根据上述算法,本次查找经历了3次磁盘读取和3次内存数据比对。由此可见,B树检索的时间复杂度主要取决于树的深度和节点存储的数据量。对于B+树的检索,算法其实和B树很相似。主要区别在于B+树的所有检索操作都不会在非叶子节点处结束,每次检索都会经过相同的长度,即从根节点到叶节点,所经历的非叶节点方式只保留索引信息,只有叶子节点保留所有键值数据。该算法将遍历的复杂度全部留在了叶节点的扫描中,减少了检索途中的IO次数,保证了叶节点扫描的局部优势,同时也保证了所有检索操作时间复杂度的相对稳定性。因此,大多数关系型数据库都选择B+树作为其存储引擎。3.2Hash对于Hash存储引擎的数据检索,首先要说说它的增删改查操作。数据文件分为活动状态和陈旧状态。在数据添加操作中,用户写入的记录直接追加到活动文件中,因此活动文件会越来越大,当达到一定大小时,活动数据文件将被冻结。引擎重新创建一个用于写入的活动文件,而之前的活动文件变为陈旧的数据文件。写入记录时,也会在索引哈希表中添加一条索引记录。在数据删除操作中,用户并没有直接删除记录,而是添加了一条具有相同Key的新记录,并设置了Value值作为删除标记。原始记录仍然存在于数据文件中,然后更新索引哈希表。这样,用户在处理检索操作时,会先读取哈希索引表中的空值记录,后面再处理原始记录。数据的更新操作不支持随机写入。对于存储系统基本功能的更新,其实和增加数据的操作是一样的,都是直接写入活动数据文件。同时修改索引哈希表中对应记录的值。此时,实际上数据文件中同一个Key值对应多条记录,根据时间戳记录判断,以最新的数据为准。数据读取操作,读取时首先从索引哈希表中定位到记录在数据文件中的具体位置,然后读出相应的记录。当然,在读取索引表时,索引的结构可能是索引树结构,在检索索引的过程中会有一定的复杂度。检索的复杂度根据树的深度来确定。4.不同存储引擎技术的选择与设计4.1B&B+Tree优缺点分析首先从用途上看,基于检索的特点,B-tree索引存储结构多用于OLTP类数据库B-tree和B+-tree的算法,因为这类数据库主要是基于事务,或者行级的读取和存储(比如MYSQL)。也就是说,这类数据库更多的操作是小批量或单行级别的随机读取和更新,也有事务性的需求。在此前提下,B+树的诞生取决于以下两点:磁盘读写成本更低。B树的内部节点没有指向关键字具体信息的指针。因此,它的内部节点比B树小。如果同一内部节点的所有关键字都存储在同一个磁盘块中,则磁盘块可以容纳的关键字越多。需要查找的关键词越多,一次性读入内存。相对而言,IO读写次数也有所减少。b.B+树只要遍历叶子节点就可以遍历整棵树。此外,数据库中基于范围的查询非常频繁,而B树实现此类操作的成本非常高且效率低下。其次,根据B-tree和B+-tree的更新和删除算法的特点,虽然该算法相对于hash等存储引擎实现的算法非常复杂和昂贵。但从另一个角度来看,正因为它不是通过大量的数据添加来实现更新和删除,所以不需要管理不同时间戳版本的重复数据。有效利用磁盘空间和内存空间,这也与我们OLTP类关系型数据库的规模和一般服务器硬件的配置相匹配。4.2Hash的优缺点分析首先,从数据结构特点来看。前面我们提到了它的数据结构和索引表的结构,我们发现最大的特点就是这些数据结构都是基于schema的。所以基于这个观点,无论是固定键值还是变化的键值,都更适合可以用键值对的方式来表示的数据存储。其次,分析一下哈希存储引擎索引表检索算法的特点。如果冲突处理算法得当,可以通过哈希函数大概率定位到数据的基本位置。与B-Tree存储引擎相比,遍历次数少,读操作多。从哈希存储引擎对数据进行增删改查的算法特性来看,除检索外的所有数据操作都是通过增加新数据变相实现的。同样与B-Tree存储引擎相比,添加一条新记录比查找、加锁、修改、释放锁的过程要高效得多。从这个意义上说,如果我们能够将满足键值对要求的索引表数据全部引入内存,那么对于随机读并发能力的提升无疑是一个巨大的质变,这也是它可以被使用的原因Redis、Memcache等选择内存数据库的一个重要原因。最后,事务性要求不是很强,涉及大量写入和更新的数据场景更有优势。矛盾始终贯穿事物的发展,有利也有弊。哈希存储引擎也是如此。正是因为它的优点,导致了一些不可避免的缺点。首先,由于哈希存储引擎的数据结构特点,对于一些内部字段与数据本身关系比较复杂的数据,比如二维表数据。哈希存储引擎将束手无策。其次,由于哈希存储引擎的检索算法是基于哈希索引表的哈希函数计算实现的,因此只能实现一次相对孤立的数据定位,对于范围查询和一些排序、分组、检索过程在检索过程。过滤等操作无能为力。最后从它的数据增删改查算法来看。它以牺牲大量存储空间来换取高运行效率,必然带来空间管理成本和数据合并处理成本。数据片越大,哈希树的高度就越高,数据检索响应的效率也会提高很多,因为哈希函数的定位必须跟随着扫描所有定位到的数据片。数据切片越大,平均检索效率越差。同时,后台进行的数据切片合并耗时较长。因此,对于数据粒度比较大,又没有好的哈希函数可以使用的场景,并不是哈希存储引擎使用的最佳场景。5.总结与展望树和散列存储引擎都是数据访问技术的设计思想。很多关系型数据库大多是基于B-Tree家族实现的,很多分布式NoSQL数据库都是基于Hash家族实现的。是的,在每个产品的具体实现过程中可能会改进一些算法细节,以优化一些缺陷,尤其是一些开源数据库。但是,这种存储引擎的基本思想是决定具体数据库产品适用场景的最根本原因。本文希望通过这些理论探讨和分析,给大家展示一个宏观的视角,从而指导具体的数据库设计实践。当然,也希望更多的业内同仁能够从更多的维度继续分析、讨论和分享。