我为什么放弃MySQL?选择了MongoDB

本文对比了MongoDB与MySQL的特点,探讨了它们在不同场景下的应用。MongoDB适合日志管理、地理位置存储、大规模数据存储等场景,而MySQL在事务处理和复杂查询上表现更佳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 最近有个项目的功能模块,为了处理方便,需要操作集合类型的数据以及其他原因。考虑再三最终决定放弃使用MySQL,而选择MongoDB。

    两个数据库,大家应该都不陌生。他们最大的区别就是MySQL为关系型数据库,而MongoDB为非关系型数据库。常见的关系型数据库有:MySQL、Oracle、DB2、SQL Server、Postgre SQL等,非关系型数据库有MongoDB、Redis、Memcached、HBse等等。

 1.关系型数据库? 非关系型数据库?

关系型数据库可以理解为依赖一个模型来创建的数据库,比如我们使用的MySQL中的表是由横列和纵列组成的一个二维表格。关系型数据库可以通过关系模型使多个表的数据关联起来,比如我们平时说的  一对一、一对多、多对一。由于是建立在数据模型的基础上,所以我们可以通过SQL语句很方便的在多个表之间做复杂的查询操作。关系型数据库相对安全,因为直接存储在硬盘中所以突然的宕机、停电等意外不会导致数据丢失。MySQL的存储方式是由自身的引擎决定的,常用的引擎有Innodb和MyISAM。他们主要的区别就是MyISAM 不支持事务,强调的是性能,执行速度比Innodb要快,Innodb提供支持事务等高级数据库功能。

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、AMDRyzen7 1700 3.65GHz。均无索引

测试语言:Python

链接工具:pymysql、pymongo

MySQL && Mongo 测试数据统计

 提交次数单次提交个数MySQL运行时间(s)Mongo运行时间(s)数据量
110001000039121622.020
2100100301.611000万
31001005.771.600
410252.351.560
510257.421.601000万
6100001298.075.290
7100001496.185.291000万

转载于:https://www.cnblogs.com/kadycui/p/10066645.html

### MongoDB 为什么MySQL 快? MongoDBMySQL 是两种不同类型的数据库系统,分别适用于不同的应用场景。在某些特定条件下,MongoDB 的性能表现优于 MySQL,主要原因包括以下几点: #### 数据存储方式不同 MongoDB 是一种文档型数据库,数据以 BSON(Binary JSON)格式进行存储,支持嵌套结构和灵活的模式设计。这种方式减少了关系型数据库中常见的多表连接操作,从而提升了查询效率,尤其是在处理非结构化或半结构化数据时更为高效[^1]。 相比之下,MySQL 是关系型数据库,依赖于固定的表结构和外键约束,复杂的 JOIN 操作会显著增加查询延迟。 #### 查询性能优势 对于没有索引 ID 的访问场景,MongoDB 的查询性能全面优于 MySQL,并且不会占用大量 CPU 资源。在千万级别的文档对象中,MongoDB 对有索引 ID 的访问速度与 MySQL 相当,但在无索引访问的情况下,其性能优势更加明显[^3]。 此外,MongoDB 更能充分利用系统内存资源,随着内存容量的增加,其查询速度也相应提升。这是因为 MongoDB 默认将尽可能多的数据缓存在内存中,避免了频繁的磁盘 I/O 操作,而 MySQL 的查询缓存机制相对较为保守[^4]。 #### 插入性能对比 在插入操作方面,MongoDB 的性能同样表现出色。测试数据显示,在不指定 `_id` 的情况下,MongoDB 的平均插入速率高于 MySQL 不指定主键插入的速度;而在指定 `_id` 或主键的情况下,MySQL 的插入性能略优[^3]。 #### 系统架构差异 MongoDB 的分布式特性使其更容易实现水平扩展,例如通过分片(Sharding)技术将数据分布在多个节点上,从而提升整体吞吐量。此外,副本集机制支持读写分离,允许将读请求分散到多个从节点,减轻主节点压力。 MySQL 虽然也支持主从复制和读写分离,但其架构更偏向垂直扩展,在高并发写入场景下容易出现瓶颈。 #### 适用场景说明 尽管 MongoDB 在某些场景下性能优于 MySQL,但这并不意味着它可以完全替代关系型数据库。例如,在需要强一致性、复杂事务处理或高度结构化数据管理的场景中,MySQL 仍是更合适的选择MongoDB 的最终一致性模型可能不适合金融或电商等对数据一致性要求极高的业务[^5]。 --- ### 示例代码:MongoDBMySQL 插入性能对比(伪代码) ```python # MongoDB 插入示例 from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client['test'] collection = db['data'] for i in range(100000): collection.insert_one({"name": f"user_{i}", "age": i % 100}) ``` ```sql -- MySQL 插入示例 INSERT INTO data (name, age) VALUES ('user_1', 25); -- 批量插入可使用 LOAD DATA INFILE 或程序循环插入 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值