MongoDB与MySQL应用与结构分析

2017-12-15 19:28叶仁鹏
电脑知识与技术 2017年32期

叶仁鹏

摘要:随着大数据的发展,原有的数据存储方式已经很能满足业务需求,很多数据的存储使用了NoSQL(非关系型数据库)。例如MongoDB、Redis就是如今很好的两种NoSQL代表。但传统关系型数据库的应用还是占据了很大的比重,很多项目的数据库还是选用Oracle、MySQL、SQL Server、DB2等。目前很多实际项目中使用关系型数据库结合NoSQL作为数据存储方式,如何选择数据库需要根据具体项目业务要求而定。通过MongoDB与MySQL作为两种数据库的代表,分析具体应用场景与数据存储结构原理。

关键词:NoSQL;关系型数据库;MongoDB;MySQL;数据存储结构

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)32-0005-02

1 概述

处在互联网科技高速发展的今天,信息大爆炸时期。当数据量过大,就需要一种新的数据存储方式,这时候的关系型数据库就显得有些力不从心,这时可以使用NoSQL—非关系型数据库。

关系型数据库中的MySQL在市场中的占有率仅次于Oracle,并且呈上升的趋势。MySQL数据库在在系统的应用中,和其他关系型数据库(Relational DBMS)有着类似的SQL语句。同时MySQL在系统中数据的查询也是比较快。通过创建MySQL的索引查找数据,其本质就是查询B+树上存储的值。查询效率也是很高的,但是在某些方面也会显得短板明显。

信息过剩时代有时關系型数据库并不能很好地解决这些问题,技术发展将会考虑使用与之对立的非关系型数据库来弥补其中的不足。MongoDB是非关系型数据库中的一种,其市场占有率已然到了前五。常用的非关系型数据库也有Redis、Cassandra、HBase等。

MongoDB在某些方面可以弥补一些关系型数据库的短板。MongoDB属于NoSQL数据的一种,NoSQL可以为Web应用数据的存储提供关系型数据库无法满足的可扩展、高性能的解决方案。同时NoSQL支持的数据结构比较松散,内部数据存储结构使用类似JSON的数据存储格式BSON(BinaryJSON),因此可以很好的弥补关系型数据库的不足,存储复杂类型数据。

MongoDB中数据索引使用B-Tree数据结构存储。它并不是传统的关系性数据库,而是以JSON格式作为存储的NoSQL,目的就是高性能,高可用,易扩展。

2 应用场景

2.1 MongoDB

MongoDB作为NoSQL数据库家族一员,具有NoSQL数据库的特性和应用价值。MongoDB内部结构使用了BSON存储数据,BSON同时也作为网络数据交换的类型。BSON是schema-free类型,所以在MongoDB中文档对应也有此特征。MongoDB中一个文档Document也类似于关系数据库中的一条记录(Record),但这Document的使用的数据类型、存储方式更丰富,例如多个Document可以相互嵌套使用。

同时MongoDB拥有高可用、易扩展性,使得以MongoDB为代表的NoSQL数据库被广泛应用在游戏、物流、电商、内容管理、社交、物联网、视频直播等。

2.2 MySQL

MySQL不同于MongoDB的文档类型数据存储格式,MySQL使用索引存储数据。MySQL数据库支持多种存储引擎,不同存储引擎对索引的支持也不相同。如全文索引、B-Tree索引、B+Tree索引和哈希索引等等。InnoDB与MyISAM存储引擎在应用中使用最为广泛。其索引内部数据结构使用B-Tree和B+Tree。

MySQL是符合三范式的标准关系型数据库,支持事物。在传统应用领域有着得天独厚的优势以及应用的成熟度。最常见的应用在Web网站、日志系统、数据仓库、嵌入式系统等。

3 内部结构

3.1 MongoDB内部数据结构

3.1.1 BSON(BinaryJSON)

在MongoDB中数据是以文档Document的形式展现,广泛被应用在服务器和客户端的交互中。

BSON是一个轻量级且类似于JSON的二进制数据存储格式。MongoDB中的数据以BSON格式存储在磁盘。

BSON数据存储结构主要拥有以下几个优点:(1)更快的遍历速度;(2)操作简易;(3)数据字段、类型易于扩展。

3.1.2 内部结构

一个集合命名空间中拥有多个数据域(extent),集合命名空间里存储集合元数据,比如集合名称,第一个数据域和最后一个数据域的位置等等。而一个数据域由若干条文档(document)组成,每个数据域都有一个头部,记录着第一条文档和最后一条文档的为知,以及该数据域的一些元数据。extent之间和document之间通过双向链表连接。

索引的存储数据结构是B-Tree,索引命名空间存储着对B-Tree的根节点的指针。

3.2 MySQL内部数据结构

3.2.1 索引

从Oracle官网(MySQL官方)了解到,索引(Index)的使用目的就是为了更高效获取数据。同时索引也是一种数据存储的结构。目前大多数文件系统和数据库系统采用B-Tree或其变种B+Tree作为索引结构。

特殊的查找算法也只能应用于特定的数据结构。二分查找算法要求被检索数据是有序排列,但是二叉树查找算法仅仅应用于二叉查找树结构,数据的组织结构不可能完全满足各种数据结构。数据库系统在存储数据之外同时还维护着满足特定查找算法的数据结构,为了能在这些数据结构上实现高级快速的查找算法,数据结构以某种最优的方式引用数据。

3.2.2 B-Tree数据结构endprint

B-Tree是一种多路搜索树。 B- Tree从根结点开始搜索,二分查找结点的关键词序列。命中则结束查找,否则查找关键词所属子结点;重复上述操作,直到所对应的子节点指针为空,或遍历找到叶子结点。

由于B-Tree数据存储特性,所以在B-Tree中按key检索数据的查找算法很直观。B-Tree上查找算法的伪代码如下:

BT_Search(btNode, btKey){

if(btNode ==null){

returnnull;}

foreach(btNode. btKey){

if(btNode.btKey[i]> btKey) {

returnBT_Search(point[i]-> btNode, btNode.btKey [i]);

}if(btNode.btKey[i]== btKey){

return btNode.data[i];

}}returnBT_Search(point[i+1]-> btNode);

}data =BT_Search(btRoot, targetKey);

3.2.3 B+Tree数据结构

B+ Tree是 B- Tree的变体,也是一种多路搜索数据结构。B+ Tree搜索与 B- Tree搜索类似, B+ Tree由于数据全部存储在叶子节点,所以只会在叶子节点命中查找(B- Tree属于可以存储在非叶子节点),B+Tree数据结构查找等价于对关键词的全集做二分查找。

B+Tree中并非所有节点具有相同的域,所以叶子节点与非叶子节点大小一般不同。这与B-Tree数据结构有很大的差别。B-Tree中虽然不同节点存放的key和指针数量可能不一致,但每个节点的域和上限是一致的,所以B-Tree遍历中为每个节点申请的空间大小相同。

3.2.4 索引内部实现

MySQL索引属于存储引擎级别。由于不同数据存储引擎对索引的实现方式也不相同,在实际工作中最常用的数据存储引擎就是MyISAM和InnoDB。

B+Tree索引结构使用在MyISAM数据存储引擎中,叶子节点的data域存放的是数据记录的地址。

InnoDB数据存储引擎使用B+Tree索引结构,但具体实现方式与MyISAM存储引擎完全不同。索引文件和数据文件在MyISAM存储引擎中是相互分离的,索引文件仅仅保存数据记录的地址。然而在InnoDB存储引擎中,表數据文件就是B+Tree的一个索引结构,完整的数据记录保存在树的叶子节点data域中。索引的key是数据表的主键,因此InnoDB存储引擎中主索引就是数据文件本身。

4 总结

本文通过分析以MongoDB为代表的NoSQL与MySQL代表的关系型数据库的对比中学习到了很多日常工作中很少留意的数据存储知识点。

在实际的开发工作中选取数据库不能执着地选取某一种,必须要根据实际的业务需求选取数据库,也可能是两者结合使用。实际开发工作一切都需要以业务和需求作为驱动选取开发工具、语言、框架以及数据库。

同时总结MongoDB数据存储的松散性和MySQL内部数据存储结构,学习到了B-Tree与B+Tree之间的差别。了解数据库内部具体数据结构对今后的开发工作很有帮助。

参考文献:

[1] 姜承尧.MySQL技术内幕-InnoDB存储引擎[M].机械工业出版社,2011.

[2] 简朝阳.MySQL性能调优与性能设计[M].电子工业出版社,2009.

[3] 霍多罗夫.MongoDB权威指南[M].2版.人民邮电出版社,2014.

[4] 吉瑛.基于MongoDB的团队协作数据存储方案研究与实现[D].中国科学院大学,2015.

[5] Thomas H Cormen.Introduction to Algorithms, Third Edition[M].机械工业出版社,2013.endprint