浅谈MySQL与mongodb的区别

讨论MySQL与mongodb使用上的区别以及可能适用的应用场景,不深入到数据库的实现细节方面。鉴于个人水平有限,文章可能存在错误之处,希望各位指正。

代码编写

  • mongodb支持reactor,可以异步操作,支持spring5的webflux开发;mysql暂时不支持异步
  • mongodb对集合collection内的文档格式无要求,这是一个好处,可以修改文档的字段而不影响原有的旧数据,但也意味着同一collection内可以存在格式不一样的数据,而且修改文档数据结构并不需要执行数据库的语句,程序在读取文档内的数据时,可能会出现部分不存在默认值的字段为null,在编码时要小心出现NPE的情况,而且改了原有字段类型还会导致旧数据反序列化失败;mysql每一张表的数据结构是固定的,可以通过在修改表的时候为新字段加上默认值避免这个问题
  • mongodb支持地理信息的存储、索引,对于一些需要按地理信息找附近地点的场景很方便
  • mongodb没有联表查询,如果按mysql表的设计根据ID关联表数据的话,需要多次查询来组合数据。或者将一些不需要跟随其他地方变更的数据直接内嵌进来,如订单里的某商品信息在商品库修改后,订单里的商品信息不需要跟随变更;mysql可以联表查询
  • 很多地方都说mongodb无事务机制,最近官方更新了对事务的支持 ,mongodb4.2以上版本已支持事务,官方文档

高可用及水平扩展

  • mongodb官方支持分片以及副本集,mysql的分库分表需要借助其他工具

性能

性能报告引至:https://cloud.tencent.com/developer/article/1005399

性能测试报告与分析
测试1-3是在TS90服务器上的测试结果,测试4对比数据库在TS80和TS90上性能。

1、各数据库的峰值吞吐量对比
image

结果分析:

  1. 在典型业务模式下(SELECT:UPDATE=95:5),MySQL和MongoDB差不多,QPS的峰值能到每秒28万左右,Redis为9.6万;
  2. 数据写入速度方面,MongoDB的QPS在每秒30万以上,Redis为4.6万,MySQL 2.3万。

2、不同业务模式的峰值吞吐量

image

注:横轴为业务模式,100:0表示SELECT与UPDATE比例为100比0,其他类似;纵轴为QPS。

结果分析:

  1. MySQL和MongoDB数据库,峰值QPS随写比例的提高逐渐下降,Redis相反,各种业务模式的峰值QPS见上图。

3、典型业务模式,不同并发压力的数据库性能
image

image

image
注:横轴为并发数;左侧曲线图的纵轴为QPS,右侧曲线图的纵轴为延迟时间。

结果分析:

  1. MySQL和MongoDB在100个并发时吞吐量达到峰值,平均延迟随并发度增加基本呈线性趋势;
  2. MongoDB并发超过100后,QPS下降很快,跟客户端驱动的连接池默认配置100个连接有关,增加测试客户端或调大连接池,QPS还可以更高。

4、TS80和TS90服务器性能对比
image
结果分析:

  1. 典型业务压力下,MySQL和MongoDB在TS90的吞吐量是TS80的2倍,Redis变化不大;
  2. 对于写入测试,MongoDB在TS90的写入速度是TS80的1.5倍,MySQL和Redis变化不大。

mongodb适用场景

对数据库具体数据格式不明确或者数据库数据格式经常变化的需求模型,有地理查询或全文查询的需求,不需要事务及复杂 join 支持,如事件、日志记录,内容管理或者博客平台

posted @ 2021-06-23 15:36  IAyue  阅读(865)  评论(0编辑  收藏  举报