1. 介绍
MySQL和MongoDB也许是现在最受欢迎和广泛使用的关系数据库和非关系数据库。他们提供了一些共同的功能,例如可扩展性、高容量、高性能等等。然而,在某些方面上,它们有所不同。本文将比较MySQL和MongoDB在缓存和数据持久化方面的不同之处。
2. 缓存
2.1. MySQL
MySQL提供了内置缓存系统,即查询缓存,它可以提高读取请求的速度。如果查询被保存在查询缓存中,则下一次相同的查询会被快速处理,而不必再次执行。这可以大大提高查询的速度。但是,查询缓存的一些缺点也需要注意:
查询缓存只能简单地缓存静态查询。如果查询中包含变量,或者查询的结果集太大,查询缓存将无法使用。
当对表进行修改时(例如插入、更新或删除),查询缓存中所有与该表相关的查询都将无效。因此,MySQL数据库的高写入流量应用程序可能不适合使用查询缓存。
查询缓存不支持复杂查询。如果MySQL服务器遇到复杂的查询,则查询不会被缓存。
2.2. MongoDB
与MySQL不同,MongoDB的缓存默认情况下被禁用。它使用系统内存作为缓存,但是它以一种不同的方式工作。MongoDB驻留在内存中的数据存储在MMap文件中,这些文件以连续块的形式映射到系统内存中。如果MongoDB需要读取未在内存中的数据,则必须从磁盘读取,这将导致性能下降。为了提高性能,MongoDB使用预取(pre-fetching)技术,使MongoDB可以在读取文档时从磁盘读取所有相关文档。这样,当MongoDB需要从磁盘读取文档时,它将从磁盘读取更多的文档,并将这些文档存储在系统内存中。这是一种非常高效的预取技术,可以显著提高MongoDB的读取性能。
3. 数据持久化
3.1. MySQL
MySQL使用传统的关系数据库范例,支持代表性的ACID特性(原子性、一致性、隔离性和持久性)。它使用B树(B+树)索引来加速数据的读取。MySQL支持多种存储引擎,包括 InnoDB、MyISAM、MEMORY、CSV 等等。
在默认设置下,MySQL使用双层文件系统(Doublewrite Buffer)将数据持久化到磁盘。它将更新记录和索引缓冲到磁盘。在本地文件系统上的 MyISAM 表不使用 Doublewrite Buffer,它们直接写入磁盘。
3.2. MongoDB
MongoDB是一个文档型数据库,也是一个非常关键的NoSQL数据库。它支持Acid的一些特性,但不同于MySQL擅长的垂直拆分,MongoDB更擅长的是水平拆分。
MongoDB的数据持久化使用了动态模式。当需要更新一个文档的时候,MongoDB会将整个文档读入内存,修改后以一种称为“写时复制”的方式写回磁盘。写时复制利用Copy On Write (COW) 实现。具体来说,MongoDB会创建一个新的文档版本,称为“修改器”,并将Modifer写入磁盘。这种方法对于大部分部分更新是很高效的,因为,MongoDB 只需要将被修改的 document 读进内存,而不是读取整个集合,这在 MongoDB 水平扩展式也是非常高效的。
当然,MongoDB 的数据存储引擎也是可以选择的。当前,最稳定,也最受欢迎的引擎是WiredTiger。当前的最大吞吐量要比 MongoDB v3.0的MMapV1引擎高出多个程序。
4. 总结
MySQL是一个传统的关系型数据库,支持丰富的ACID特性和丰富的存储引擎。而MongoDB是一个非关系型数据库,更加擅长分布式存储和大数据应用场景。在缓存方面,MySQL内置的查询缓存机制可以提高读取请求速度,但有一些缺点限制其适用范围。MongoDB的缓存是动态的,使用了预取技术,从而可以有效地加快读取文档的速度。在数据持久化方面,MySQL采用传统的关系型数据库范例支持ACID特性,而MongoDB则支持ACID特性加上动态模式和一些NoSQL的特性,更加适合于大数据应用场景。