当前位置:首页 > 运维干货

从MySQL和MongoDB的对比,看SQL与NoSQL的较量

e8yw

  一、为什么调研MongoDB?

  图1-1是DB-Engines2017年11月数据库的排名统计,可以看到MongoDB总排名在第5,在NoSQL数据库中排名第1。


  MongoDB


  图1-1DB-Engines2017年11月数据库的排名统计


  优点:


  社区活跃,用户较多,应用广泛

  MongoDB在内存充足的情况下数据都放入内存且有完整的索引支持,查询效率较高

  MongoDB的分片机制,支持海量数据的存储和扩展

  缺点:


  不支持事务

  不支持join、复杂查询

  初步调研下来,MongoDB具备我们需要的特性,而缺点不影响应用场景,故接下来我们就开始做实际的性能压测。


  二、压测性能对比

  1、准备条件


  (1)MySQL、MongoDB数据库所在服务器硬件环境


  MySQL


  表2-1服务器硬件环境主要参数


  (2)最新的数据库版本


  MongoDBserverversion:3.4.5

  MongoDBclientversion:mongo-java-driver-2.14.3

  MySQLserverversion:5.6.34

  MySQLconnectorversion:MySQL-connector-java-6.0.6

  MongoDB使用的储存引擎wiredTiger

  MySQL使用的储存引擎InnoDB


  (3)数据库表结构及索引


  MongoDB索引为dateTime且是唯一索引。我们实际测试使用的MongoDB数据结构及字段如图2-1所示。


  数据


  图2-1MongoDB数据表记录示


  MySQL索引为DATETIME,PARTNER_ID,GOODS_ID,SCOPE且是唯一索引。我们实际测试使用的MySQL数据结构及字段如图2-2所示。


  索引


  图2-2MySQL数据表记录示例


  QL语句根据datetime字段进行时间范围的查询


  (4)连接池最大连接数都设置为200个,SQL语句调到最优


  2、百万、千万级别的下不同查询量不同并发量的压测结果

  数据库表中记录数总量在百万、千万级别的压测数据及结果如表2-2所示。


  数据


  表2-2百万、千万级别的压测数据及结果


  3、亿级别的下不同查询量不同并发量的压测结果

  数据库表中记录数总量在亿级别的压测数据及结果如表2-3所示。


  数据


  表2-3亿级别的压测数据及结果


  压测结果分析:


  当每次查询数据量在500条时,无论表中数据总量千万或者亿级别,MySQL和MongoDB在100线程并发的情况下查询性能相当,表现良好,平均响应时间在500ms以内,TPS在230左右。

  当每次查询数据量在5000条时,表中数据总量为千万级别时,MongoDB在50线程并发情况下查询性能不及MySQL的一半,100线程并发情况查询性能都很差,平均响应时间在4500ms左右,表中数据总量为亿级别时,在50个及以上的并发情况下,MongoDB和MySQL性能都较差。

  在本案例简单数据模型下时间范围内的等值查询应用场景下,MongoDB在高并发条件下的大数据量查询性能并没有比MySQL更好。另外还有一点需要注意的是,在本案例中,数据总量由百万级别到千万级别再到亿级别的变化过程中,对于查询性能的影响都不是很大,但对于查询数据量的数倍增长却十分敏感,所以在考量数据库查询性能时,也要重点考量应用的单次查询量的需求。


  尽管MongoDB在我们的这种应用场景下并没有达到预期的性能,我们也简单地的调研了下MySQL和MongoDB对于内存的使用机制以及一些可能影响查询效率的内部配置。


分享到: