内容提要
这篇文章比较了文档数据库和关系数据库的相似和不同之处,并认为MongoDB在高吞吐量联机事务处理方面比关系数据库更高效。作者进行了一系列测试,发现MongoDB在读取方面更快。文章还提到了测试注意事项和结论。
延伸解读
测试设计的公平性考量
作者刻意避免对任一数据库进行过度调优,并选用云托管服务以减少配置偏差。但测试仍存在局限:MySQL 的并行处理表现异常,作者推测可能与服务器调整有关;MongoDB 使用三节点副本集,而 MySQL 和 PostgreSQL 仅用双节点,尽管价格相近,但资源分配并不完全对等。读者需注意这些因素可能影响结果的可比性。
读写性能的差异与代价
在读取方面,MongoDB 比 PostgreSQL 快 50–100%,比 MySQL 快得多;插入速率仅比 PostgreSQL 快 5–10%。但更新操作比 PostgreSQL 慢 2–4 倍,原因是文档较大导致 I/O 更多。这表明文档模型在读多写少场景优势明显,而频繁更新小字段时关系型数据库可能更高效。
成本结构的关键区别
MongoDB Atlas 的定价已包含所有磁盘 I/O 成本,而云提供商的 RDBMS 会额外收取每百万次 I/O 0.22 美元的费用,可使计算实例成本增加 50% 到 250%。因此,虽然实例规格相近,但总拥有成本可能差异显著,读者在选型时应将 I/O 费用纳入考量。
文档建模的优化空间
作者指出,将 200 多个字符串说明嵌入文档会导致平均大小 1260 字节,而使用 $lookup 查询可减少到 895 字节,从而提升读写速度。这说明文档数据库的性能优势并非自动获得,需要根据工作负载合理设计文档结构,避免过度嵌入。
Q&A
文档数据库和关系数据库主要有哪些相似和不同之处?
相似之处包括强类型数据、ACID事务、富查询、更新和聚合功能,以及索引和B树等。不同之处在于文档数据库能在存储和数据建模层将表格碎片嵌入其他表中,类似RDBMS中按索引组织的表格,但为特定工作负载提供了更大的优化范围,并且能轻松从Java、C#等现代语言保存对象。
MongoDB在哪些工作负载下比关系数据库更高效?
MongoDB非常适合电子商务或物流等高吞吐量联机事务处理(OLTP)工作负载,既可在其中读写数据,也可将其看作信息源。对于给定读取/写入/更新工作负载,MongoDB在单位成本执行的事务数量和每开发小时所开发的功能数量上效率远超RDBMS。
作者是如何测试MongoDB与MySQL、PostgreSQL的性能的?
作者模拟英国政府的汽车检测系统,使用2021年超过4000万个测试结果,在主要云提供商环境中使用MongoDB Atlas、托管MySQL和PostgreSQL,采用多线程Java代码,测试了检索最新测试详情、添加新汽车、未通过测试和修改结果等操作,并设置了不同的读写更新比率和线程数。
测试结果显示MongoDB在读写性能上相比PostgreSQL和MySQL有哪些优势?
在读取方面,MongoDB Atlas比PostgreSQL快50-100%,比MySQL快得多。每笔事务成本更低,因为Atlas定价包含所有I/O成本,而RDBMS产生额外IOPS成本。新数据插入速率MongoDB比PostgreSQL快5-10%,但更新操作比PostgreSQL慢2-4倍,但仍比MySQL快。
为什么MongoDB在更新操作上比PostgreSQL慢?
因为MongoDB在大得多的文档中更改单一值,导致写出更改时I/O比PostgreSQL多。文章建议使用$lookup查询将说明移到外部,可将文档大小从平均1260字节减少到895字节,从而显著提高读写速度。
在测试中,MongoDB的代码量相比RDBMS如何?
MongoDB只需要20%的代码行就能够读取和写入数据库,因为不需要在一个事务中执行多次插入就能保留和检索对象,也不需要从多行重建对象。