我为什么放弃MySQL?最终选择了MongoDB
最近有个项目的功能模块,为了处理方便,需要操作集合类型的数据以及其他原因。考虑再三最终决定放弃使用MySQL,而选择MongoDB。
两个数据库,大家应该都不陌生。他们最大的区别就是MySQL为关系型数据库,而MongoDB为非关系型数据库。常见的关系型数据库有:MySQL、Oracle、DB2、SQL Server、Postgre SQL等,非关系型数据库有MongoDB、Redis、Memcached、HBse等等。
1、关系型数据库? 非关系型数据库?
关系型数据库可以理解为依赖一个模型来创建的数据库,比如我们使用的MySQL中的表是由横列和纵列组成的一个二维表格。关系型数据库可以通过关系模型使多个表的数据关联起来,比如我们平时说的 一对一、一对多、多对一。由于是建立在数据模型的基础上,所以我们可以通过SQL语句很方便的在多个表之间做复杂的查询操作。关系型数据库相对安全,因为直接存储在硬盘中所以突然的宕机、停电等意外不会导致数据丢失。MySQL的存储方式是由自身的引擎决定的,常用的引擎有Innodb和MyISAM。他们主要的区别就是MyISAM 不支持事务,强调的是性能,执行速度比Innodb要快,Innodb提供支持事务等高级数据库功能。
非关系型数据库即我们常说的NoSQL数据库,部署起来都比较简单,没有关系型数据库那么复杂。Mongo的存储方式为虚拟内存+持久化存储,Mongo将数据写入内存中,再由虚拟内存管理器将其持久化到硬盘中,因此写操作会比关系型数据库快很多。NOSQL的存储格式是key-value形式,可以像关系型数据库那样存储基础数据类型的数据,也可以存储集合、对象等等。NoSQL虽然性能比较高,但是并不支持事物,也不能进行联表查询,一般用于较大规模数据的存储。
2、他们的优点、缺点有哪些
关系型数据库发展了很长一段时间,拥有非常成熟的体系。所占份额也在逐渐增加。而且支持事物的操作,保证数据的一致性,可以通过SQL语句完成复杂的操作。但是使用过程中当数据量到达一定程度时,关系型数据库的效率会有明显的下降。一个复杂的查询操作,一系列的组合索引都会消耗非常多的内存空间,此时我们需要对数据库进行读写分离操作,或者将数据库结构进行拆分(水平拆分、垂直拆分)将请求压力分担在不同的库中。
垂直拆分是指将一张表拆分成多个表,表之间通过主键进行关联。
水平拆分是按照某种规则拆分成多个表,比如通过用户角色进行拆分
读写分离:所谓读写分离就是讲读操作(查询数据)和写操作(插入&更新)指向不同的数据库节点,他们中间通过某种机制实现数据的同步,如binlog。实际的应用中大部分压力还是来自读操作,所以主要是一主多从的架构。
非关系型数据库发展的这几年,深受人们的喜爱。免费开源、成本低、部署简单、非结构化存储等等明显的优势。而且它对海量数据处理能力非常强,内存级数据库,查询速度也非常快。存储的数据格式比较丰富,易于扩展,虽然不能使用sql进行复杂的查询,但是MongoDB支持JavaScript,所以可以通过js脚本进行复杂的数据库管理操作。关于NoSQL的缺点个人感觉目前就是不支持事物了吧,其他方面那都不是事儿。
3、什么时候用mongo
Mongo是用c++编写的,支持多种语言如:Java、Python、Ruby、PHP、C++、C# 等,有时候针对不同的业务需求,选择Mongo能够避免浪费很多不必要的资源
日志系统
系统运行过程中产生的日志信息,一般种类较多、范围较大、内容也比较杂乱。通过MongoDB可以将这些杂乱的日志进行收集管理。不仅方便了管理,查找或者导出也会变得非常容易
地理位置存储
MongoDB支持地理位置、二维空间索引,可以存储经纬度,因此可以很快的计算出两点之间的距离,等位置信息。如查询附近的人、或者订餐系统、配送系统等
数据规模增长很快
前面提到过关系型数据库数据量过大时,需要进行分库分表,这样真正操作起来可能会比较麻烦。如果选择mongo进行分库分表操作时,就会变得很简单。
保证高可用的环境
Mongo本身就拥有高可用及分区的解决方案,设置主从服务器非常方便,除此之外Mongo还可以快速并且安全的实现故障节点的转移。
文件存储需求
GridFS是MongoDB规范,用于存储和检索图片、音频、视频等大文件。GridFS虽然是文件存储的一种方式,可以存储超过16M的文件。但是它本身又是存储在MongoDB集合中的
其他场景
如游戏开发中我们可以通过MongoDB存储用户信息、装备、积分等,除此之外物流系统、社交系统、甚至物联网系统,Mongo都能提供完美的数据存储服务。
4.MySQL、MongoDB简单的性能测试
关于两个数据的性能,最有力的的说话还是通过实践来进行测试,网上看到一组测试数据,分享给大家。
测试环境:Windows 10、内存8G、CPU i5 3.30GHZ。均无索引
测试语言:Python
链接工具:pymysql、pymongo
MySQL && Mongo 测试数据统计
| 提交次数 | 单次提交个数 | MySQL运行时间(s) | Mongo运行时间(s) | 数据量 | |
|---|---|---|---|---|---|
| 1 | 1000 | 10000 | 3912 | 1622.02 | 0 |
| 2 | 100 | 100 | 30 | 1.61 | 1000万 |
| 3 | 100 | 100 | 5.77 | 1.60 | 0 |
| 4 | 10 | 25 | 2.35 | 1.56 | 0 |
| 5 | 10 | 25 | 7.42 | 1.60 | 1000万 |
| 6 | 10000 | 1 | 298.07 | 5.29 | 0 |
| 7 | 10000 | 1 | 496.18 | 5.29 | 1000万 |
欢迎关注我的个人公众号:【程序员共成长】
一个专门面向程序员群体的圈子,专注分享日常学习总结、业内资讯、优质学习视频资源, 这里不光有技术、还有诗和远方…给新加入的小伙伴准备了见面礼,包括但不限于Java、Python、Linux、数据库、大数据、架构以及各方向电子书。公众号内回复[礼包]即可领取。

我为什么放弃MySQL?最终选择了MongoDB的更多相关文章
- 我为什么放弃MySQL?选择了MongoDB
最近有个项目的功能模块,为了处理方便,需要操作集合类型的数据以及其他原因.考虑再三最终决定放弃使用MySQL,而选择MongoDB. 两个数据库,大家应该都不陌生.他们最大的区别就是MySQL为关系型 ...
- MySQL如何选择合适的索引
先来看一个栗子 EXPLAIN select * from employees where name > 'a'; 如果用name索引查找数据需要遍历name字段联合索引树,然后根据遍历出来的主 ...
- 选择或者放弃MySQL的理由
MySQL 作为一个开源数据库,自从被 Oracle 接管后,其发展前景就一直受到开发社区的关注,其中也有质疑,最近,两位开发者分别发表了选择和放弃MySQL 的理由,值得数据库相关人员参考. And ...
- 为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate
一.前言 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template. Hibe ...
- Mysql 分组选择
Mysql 分组选择 在其他的数据库中我们遇到分组选择的问题时,比如在分组中计算前10名的平均分 我们可以使用row_number()over() 比较方便的得到. 但是在mysql中,问题就被抛了出 ...
- Navicat Premium 12 破解(MySQL、MariaDB、MongoDB、SQL Server、SQLite)
打开注入到安装目录中的exe中 破解提示(还没好,继续看下去) 如果你安装的是中文版,选一下中文版(英文默认即可),获取一下key(名字和组织可以自定义) 打开Navicat,选择注册(第一次打开选注 ...
- 了解常用数据库MySQL、Oracle、MongoDB
本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net 注:转载文章 什么是数据库 简单的说,数据库(英文 Dtabase)就是一个存放数据的仓库,这个仓库是按照一定的数据结果( ...
- 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式
单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式 一 表结构如下: 万行 CREATE TABLE t_audit_operate_log ( Fid b ...
- MySQL索引选择不正确并详细解析OPTIMIZER_TRACE格式
一 表结构如下: CREATE TABLE t_audit_operate_log ( Fid bigint(16) AUTO_INCREMENT, Fcreate_time int(10) un ...
随机推荐
- Jquery浅克隆与深克隆
Jquery浅克隆与深克隆 JavaScript部分 $("div").on('click', function() {//执行操作}) //clone处理一 $("di ...
- leetCode刷题(找到最长的回文字符串)
Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...
- Java并发之AQS详解
一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQ ...
- Oracle数据库表分区
一.Oracle数据库表分区概念和理解 1.1.已经存在的表没有方法可以直接转化为分区表. 1.2.不在分区字段上建立分区索引,在别的字段上建立索引相当于全局索引.效率 ...
- element-ui bug及解决方案
1.element-ui 使用MessageBox后弹窗显示异常 解决方案:去掉Vue.use(MessageBox); 2.element-ui 分页切换后若改变总数会导致请求两次 解决方案:< ...
- mysql中如何处理字符
concat函数 使用方法: CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意: 如果所有参数均为非二进制字符串,则结 ...
- nuget的问题, NuGet 程序包还原失败
将项目中的packages.config 中引用移除. 1.使用nuget管理器,进行安装 2.下载对应dll,手动引入项目
- HTML学习之制作导航网页
前言 今天用HTML写了一个网址导航,源代码如下: <html> <head> <title>网址导航</title> </head> &l ...
- 第五章——支持向量机(Support Vector Machines)
svm可用于线性或非线性分类.回归.甚至异常检测. svm尤其适用于中小数据集的复杂分类问题. 5.1 Linear SVM Classification svm对feature scales敏感,如 ...
- 优雅地实现CSS Animation delay
今天写一个css动画时遇到一个有意思的问题,记录如下: 1.需求: 等待元素A的动画加载完,再加载B元素的动画(下图中A为大熊猫,B为下方卡片) 先来看下最后的效果啦: 2.初始思路: 在B元素的动画 ...