数据库种类这么多,它们都有什么区别呢?【这次高斯不是数学家】

gentle_zhou 发表于 2022/05/11 15:51:44 2022/05/11
【摘要】 MySQL数据库、postgresql数据库、opengauss数据库、Redis数据库、MongoDB数据库、influx数据库...诸如此类,每次看到就有点头大。除了经常会用到的mysql数据库、redis数据库,偶尔会接触到的postgresql数据库,别的数据库只是略有耳闻。那么它们都是什么呢?哪些是关系型?那些是非关系型?哪些甚至不是这两种类型呢?

MySQL数据库、postgresql数据库、opengauss数据库、Redis数据库、MongoDB数据库、influx数据库…诸如此类,每次看到就有点头大。除了经常会用到的mysql数据库、redis数据库,偶尔会接触到的postgresql数据库,别的数据库只是略有耳闻。那么它们都是什么呢?哪些是关系型?那些是非关系型?哪些甚至不是这两种类型呢?

本文会简单介绍下这些形形色色的数据库,对它们有个初步的理解。

MySQL数据库 【sql】

MySQL数据库是一个由瑞典MySQL AB公司开发,开放源码的关系数据库(具有关系型结构)管理系统。它是用C和C ++编写的,并使用了多种编译器进行测试,保证源代码的可移植性,并未多种编程语言提供了API。

同时,mysql支持多线程,提供用于管理、检查、优化数据库操作的管理工具,使用标准的SQL数据语言形式。

使用原理:Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的;Mysql的存储引擎是插件式的,是MySql中具体的与文件打交道的子系统,根据文件访问层的一个抽象接口来定制的一种文件访问机制。

MySQL数据库的内部架构图:
image.png

postgresql数据库 【sql】

postgresql数据库是一个开源的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行,支持 SQL(关系型)和 JSON(非关系型)查询。它是一个多进程架构的高度稳定的数据库管理系统,依托 20 多年的社区发展,造就了其高水平的故障恢复能力、完整性和正确性。

使用原理:PostgreSQL支持并行化,会包含3个重要的组件:leader进程(进程本身),gather节点 和 worker进程。
当PostgreSQL没有开启并行化的时候,leader进程自身处理所有的数据;而当决定某个查询或查询中部分可以使用并行的时候,就会在并行化部分添加一个gather节点,将gather节点作为子查询树的根节点,查询则会从leader进程开始执行,并分配多个worker进程。

postgresql数据库的体系架构图:
image.png

opengauss数据库 【sql】

openGauss是一款开源关系型数据库管理系统,采用单进程多线程架构,并提供客户端/服务器:客户端可以使用JDBC/ODBC/Libpq/Psycopg等驱动程序,向openGauss的后端管理线程GaussMaster发起连接请求。openGauss支持如下基本功能:支持标准SQL,支持标准开发接口,支持混合存储引擎、支持事务(ACID)。

使用原理:openGauss是单机系统,支持一主多备。业务数据存储在单个物理节点上,数据访问任务被推送到服务节点执行,通过服务器的高并发,实现对数据处理的快速响应。同时通过日志复制可以把数据复制到备机,提供数据的高可靠和读扩展。

opengauss数据库的逻辑架构图:
image.png

注:基于openGauss,华为云打造了自研企业级分布式存储服务GaussDB,兼容业界主流绝大部分的数据库:
image.png

Redis数据库 【NoSQL】

NoSQL(Not Only SQL)则不具有关系结构,意味着可以让多台计算机为我们完成工作以此提高系统的性能。

而Redis 是完全开源的,遵守 BSD 协议,一个高性能的 key-value 数据库,是NoSQL结构的。Redis数据库有以下三个特点:

  1. Redis支持数据持久化,可以将内存中的数据(缓存)保存在磁盘(数据库)中,重启的时候就可以再次加载使用;
  2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储,这些数据类型都支持push/pop(推进/弹出)、add/remove(添加/删除)及取交集并集和差集及更丰富的操作
  3. Redis支持数据的备份,即master-slave模式的数据备份。

Redis优势在于:性能极高(读写速度很快);支持 Strings, Lists, Hashes, Sets 及 Ordered Sets数据类型;操作是原子性的。

使用原理:Redis是一个Key-Value类型的内存数据库,整个数据库统统加载都在内存当中进行操作,并且会定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
Redis是单进程单线程的,利用队列技术让Redis数据库变味了串行访问,消除了传统数据库串行控制的开销。

Redis数据库的逻辑架构图(有2个:客户端和服务器端,可以都在一台机器上或在两台机器上):
image.png

MongoDB数据库 【存文档型数据】

MongoDB是一个基于分布式文件存储的数据库(不是用来存结构化数据),由C++语言编写,目的是为WEB应用提供可扩展的高性能数据存储解决方案:网站实时数据处理、缓存、高伸缩性的场景。MongoDB是一个介于关系数据库和非关系数据库之间的产品。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
image.png

使用原理:数据会被分组存储在一个称为集合(collection,类似于sql数据库里的表) 的数据集中,每个集合在数据库中都有一个唯一的标识名并且可以包含无限量的文档(数据),这也被称为面向集合(collection-oriented);而对于存储在MongoDB里的文档,我们都不需要指导它的结构定义,这被称为模式自由(schema-free)。

MongoDB数据库与SQL数据库的结构对比图:
image.png

influx数据库 【时序数据库】

要了解这个数据库,我们需要先理解一个概念:时序数据库,经常应用于机房运维监控、物联网IoT设备采集存储、互联网广告点击分析等基于时间线且多源数据连续涌入数据平台的应用场景。InfluxDB专为时序数据存储而生。

时序数据应用场景就是在时间线上每个时间点都会从多个数据源涌入数据,按照连续时间的多种纬度产生大量数据,并按秒甚至毫秒计算的实时性写入存储。时序数据结构:数据源(DataSource)+指标项(Metric)+时间戳(TimeStamp)=数据点,每个数据点就是时间线上的一个指标测量点。

InfluxDB并没有打算完全搞一套全新的数据存储理论体系,而是在参考HBase的LSM-Tree数据模型后,建立一套适合时序数据的存储架构,名叫TSM。而InfluxDB在Cache中重新优化了结构:Map集合<数据源,Map集合<指标,List列表<时间戳:数据值>>>

参考资料

  1. http://c.biancheng.net/view/4504.html
  2. https://blog.csdn.net/mijichui2153/article/details/104768538
  3. https://www.modb.pro/db/71269
  4. https://baike.baidu.com/item/openGauss/49969162
  5. https://res-static.hc-cdn.cn/cloudbu-site/china/zh-cn/云学院/Materials for certification/HCIA-openGaussV1.0TrainingMaterial.pdf
  6. https://aws.amazon.com/cn/rds/postgresql/what-is-postgresql/
  7. https://blog.csdn.net/asmartkiller/article/details/120497944
  8. http://www.uml.org.cn/sjjm/201803161.asp
  9. https://www.runoob.com/mongodb/mongodb-intro.html
  10. https://juejin.cn/post/7027025915704016910

征文活动

【这次高斯不是数学家】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/345260

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。