共计 3861 个字符,预计需要花费 10 分钟才能阅读完成。
今天的主题是从 MongoDB 漫谈数据库,在日常的项目中,我们一般都是使用的 mysql 作为数据库,但是一旦有问题,又常常会听到类似“要不换成 MongoDB 试试”的声音,因此就让我们这些小白来随便聊聊数据库
什么是数据库
我们就用最简单的话来说,数据库,就是保存数据的一个仓库
数据库(Database)的基本概念
数据库就是按照一定的数据结构来组织,储存和管理数据的仓库
我们写的程序都是在内存中运行的,一旦程序运行结束或者计算机断点,程序运行中的数据就会全部丢失;所以我们就需要将一些程序的数据持久化到键盘之中,以确保数据的安全性。
数据库则是大批量数据持久化的普遍选择,1. 文件 2. 数据库
为什么用数据库存储数据
数据库是有结构的
数据库可以提供各种接口,让数据处理(增删改查)快捷方便
各种语言(PHP、jsp、.net..)提供了完善的接口
数据库流行度(来源:https://db-engines.com/en/ranking)
从统计的数据中可以看出,最受欢迎的 DBMS 是“关系型”,前五名中占据了四位,把数据扩大到前十,关系型数据库也占到了七位之多。
为什么大多数程序员更喜欢使用 MySQL?
开源,只有企业才需要购买许可证
具有广泛的用途:可广泛用于大多数平台,如 Linux,Windows,Ubuntu,Mac OS X 等
易于使用
可靠的:多年来一直经过试验和测试
适用于 PHP(PHP 天下第一),也可以与其他编程语言一起使用,如 JAVA,PERL,C,C ++ 等
适用于小型和大型应用
那么关系型数据库这么好为什么前五名中还会出现 MongoDB 的身影呢,我们来看一下
关系数据库和 MySQL 的缺点是什么?
可伸缩性:向特定记录添加更多数据可能涉及扩展到多个表,列和行,而因为数据是按行存储,即使只针对其中某一列进行运算,关系型数据库也会将整行数据从存储设备中读入内存,导致 I / O 较高
由第一条产生而来的一个缺陷就是无法存储数据结构
速度:由于数据结构的问题倒是分析数据时需要一定的时间,另外只能够进行子字符串的匹配查询,当表的数据逐渐变大的时候,like 查询的匹配会非常慢,即使在有索引的情况下
在使用之前,需要先编写架构以定义表,同时表结构 schema 扩展不方便 如要需要修改表结构,需要执行执行 DDL(data definition language),语句修改,修改期间会导致锁表
是什么让 MongoDB 如此吸引人?
灵活性:文档结构更符合开发人员在各自编程语言中的编码方式,这些编程语言在键值对中是清晰且结构化的,这样可以随时轻松添加和编辑数据 / 文档
支持各种查询:字段,表达式,范围查询,JavaScript 函数等
更快的周转时间:因为存储在 MySQL 数据库中的多个表中的相关数据存储在 MongoDB 中的同一文档中
没有严格的模式:可以在定义文档结构之前先创建文档
MongoDB 的功能使它更适合处理大量数据
先让我们来比较一下两者再来详细说明
MySQL
MongoDB
版本
1995- 2018(mysql 8.0)
2009
结构
关系型
非关系型
灵活性
弱,需要在使用之前先定义数据库模式
与 MySQL 相比具有相当大的灵活性 – 定义不需要的模式
可扩展性
可以,但是比较困难,MySQL 数据库可以垂直扩展,可以向单个服务器添加更多资源
比 MySQL 更具可扩展性。MongoDB 可水平扩展,可以添加更多服务器来扩展您的数据库
需要 DB 管理员
是
否 – 开发人员和管理员都可以使用
适用场景
会计师事务所和银行,以及需要具有清晰架构的结构化数据的其他公司。非常适合具有或多或少固定要求的企业(twitter 例外)
具有实时数据,物联网,内容管理,移动应用,社交网络,面向大数据 / 网络分析的系统以及不需要具有清晰架构或其架构的结构化数据的业务的理想选择不断变化
灵活性
首先说说灵活性,举个列子,一个商城里面会有许多的商品,而这些商品都是有自己独特的属性的,比如电视有屏幕尺寸、屏幕分辨率,而空调有制冷类型、外机噪音等属性,要把它们放到产品表里是非常困难的,额外增加了程序员对于数据表设计的工作,而 MongoDB 没有 Schema(模式、数据模型)就会显得很简单。
MongoDB 的灵活还体现在非结构化和半结构化的数据上。MongoDB 提供全文索引,也支持地理位置查询和索引。例如一位用户想知道方圆五公里哪里有公共卫生间,这是「地理范围查询」。然后他搜索最近的单车。摩拜单车正是使用 MongoDB 完成这样的「距离排序查询」。
可扩展性
数据一台机器放不下了,就需要 sharding(分片)把它放到好几台机器上去。分片是 MongoDB 多年以来的原生功能,与 MongoDB 其他功能高效整合。
例如,分片集群中一个复杂的聚合查询会自动地根据 Shard Key(片键)分配到多个结点上运行,尽可能将计算任务下推到数据结点上,最后在一个结点上聚合所有结点的结果。分片还可以在各个结点间自动迁移数据,均衡其数据量。同时配合着 MongoDB 的复制(副本集)技术,可以有效的避免数据的丢失(在测试的时候发现 mongo 会自动发现副本集的所有机器地址,当一台 Mongo 被停掉时,连接的 Server 不会报错)
MongoDB 中使用分片集群结构分布:
MongoDB 的缺点
众所周知,MongoDB 占用了大量的服务器内存
MongoDB 在安全性上略微会差一点
过于自由灵活的文件存储格式带来的数据错误(。。。。。。)
单个文档大小限制为 16 M
对于数组型的数据操作不够丰富
什么时候选择 MongoDB
说了这么多狗屎一样总结的话,最重要的就是我们在什么时候选择使用 MongoDB
日志系统,系统运行过程中产生的日志信息,一般种类较多、范围较大、内容也比较杂乱。通过 MongoDB 可以将这些杂乱的日志进行收集管理
地理位置存储,MongoDB 支持地理位置、二维空间索引,可以存储经纬度,因此可以很快的计算出两点之间的距离,等位置信息
数据规模增长很快(比如供给的关注信息)
需要保证高可用的环境
文件存储需求
其他场景,如游戏开发中可以通过 MongoDB 存储用户信息、装备、积分等,除此之外物流系统、社交系统、甚至物联网系统
数据库的类型
说了这么多,为什么我们会把 mysql 和 MongoDB 放在一起比较进行选择,就是因为它们是不同类型的数据库,从数据库发展至今,大致上分为三种类型
RDBMS(关系型数据库)
首先要提到的一定是我们最熟悉的 mysql 数据库所属于的关系型数据库。
关系型数据库的特点:
比如 MySql、sql server Oracle 等
特点 通过一张张表来建立关联
基本都使用 SQL 语言来管理数据库
Nosql (非关系型数据库)
NoSql,也就是 MongoDB 的数据库类型,源自 2009 年在 San Francisco 举办的一次 Meetup,在该 Meetup 上出现了 NoSql 技术的描述:open source, distributed, non relational databases
非关系型数据库的特点:
没有行、列的概念 用 json 类储存数据
集合相当于“表”,文档相当于“行”
标准化和非标准化的摩擦。
标准化限制创新,非标准话不能统一
NoSql 在刚提出的时候被解释成 Non-Relational,也有 No-sql 的意思,但是随着近些年的快速发展,SQL 已经逐步被应用在了更广泛的领域,因此,SQL 已不再是 RDBMS 的专属特征,NoSql 技术体系中也引入了 SQL 能力,因此而演变出来了 Not-Only-SQL 的概念
大多数 NoSql 技术,弱化了对 ACID 语义以及复杂关联查询的支持,采用了更加简洁或更加专业的数据模型,优化了读写路径,从而能够换取更高的读写性能
NewSql
根据 wiki 中的定义
<font color=#FF7F50 size=5 face=” 黑体 ”>NewSQL</font> is a class of modern relational database management systems that seek to provide the same scalable performance of NoSQL systems for online transaction processing (OLTP) read-write workloads while still maintaining the ACID guarantees of a traditional database system.
NewSql 可以说是传统的 RDBMS 与 NoSql 技术结合之下的产物,因此,可以将典型 NewSql 技术理解成分布式关系型数据库,能够支持分布式事务是一个基本前提。NoSQL 与 NewSQL 在技术栈上有很多重叠,但在是否支持关系型模型及对复杂事务的支持力度上是存在明显区别的。因为本人不了解,所以这里不做多说。
这里我只是简单的介绍一下数据库的类型,对于一种存储技术属于 NoSql 或者 NewSql, 亦或是 RDBMS 是不能简单归类的,毕竟技术是在不断进步的,比如 MySQL 现在也兼容了 nosql 的特性:
或者有的人会奇怪为什么在介绍 MongoDB 的缺点时没有提事务的事,这是因为在 2018 年夏季的 MongoDB4.0 版本中,MongoDB 引入了事务功能,支持多文档 ACID 特性,例如使用 mongo shell 进行事务操作
具体压测数据后期补上
参考文章:
《MongoDB vs MySQL : Understanding the difference》——Tanya Noronha
《NewSQL 是否是 NoSQL 的取代者?》——Jaison
《MongoDB 4.0 事务实现解析》——张友东