MySQL 或 MariaDB 是不是有任何类型的内存数据库?

Posted

技术标签:

【中文标题】MySQL 或 MariaDB 是不是有任何类型的内存数据库?【英文标题】:Does MySQL or MariaDB have any kind of in-memory database?MySQL 或 MariaDB 是否有任何类型的内存数据库? 【发布时间】:2019-01-02 12:58:31 【问题描述】:

我正在使用单元/集成测试,而 SQLite 不完全支持某些 SQL 功能(例如 RIGHT JOIN 和 FULL OUTER JOIN)。有什么方法可以使用 mysql(或 MariaDB),其中数据库的内容完全存储在内存中?

MySQL 有 MEMORY 表引擎,但是,这个表引擎在我的测试中仍然可能会产生不一致。我需要的是 :memory: 的替代方法,来自 SQLite,但具有与 MySQL 相同的功能。

编辑:

更具体地说,我的问题与单元/集成测试的性能有关。一些教程表明使用 SQLite 和内存中的数据库来加速测试过程,但是,我的应用程序中的一些查询与 SQLite 不兼容。如果生产数据库是 MariaDB,我也认为在 SQLite 中进行测试不是一个好习惯。

我的问题是在 MySQL/MariaDB 中是否有任何替代测试的方法与 SQLite :memory: 选项的工作方式相同。

【问题讨论】:

您的问题的答案是 MEMORY 存储引擎。您需要更清楚地了解问题所在。您可以在“内存”虚拟磁盘上使用另一个存储引擎,但这取决于您的操作系统。 哪些不一致? 第一个问题是“为什么?”因为在内存中测试将部署在磁盘上的内容通常是一个糟糕的计划,其次,如果您真的需要在内存中使用它,请使用 ramdisk。 MySQL和MariaDB没有FULL OUTER JOIN,但是可以轻松模拟。 通常单元测试根本不应该触及数据库,你正在做的可能是集成测试,对于这样的测试我更喜欢独立的mysql服务器,所以设置中的测试套件将创建数据库,所有表格,样本数据并在最终确定期间全部删除 【参考方案1】:

MariaDB 有the MEMORY storage engine:

它最适合用于其他表中数据的只读缓存,或用于临时工作区。

这听起来完全适合在自动化测试期间快速设置和拆卸数据库。

【讨论】:

感谢您的回答。 MariaDB 确实有 MEMORY 表引擎,但是它不能很好地适用于所有列类型(TEXT、BLOB 等)。就我而言,这不是一个可行的选择。我的解决方案是使用受控环境,将 MySQL 数据目录 (/var/lib/mysql) 直接挂载到 RAM 中(感谢 Linux)。

以上是关于MySQL 或 MariaDB 是不是有任何类型的内存数据库?的主要内容,如果未能解决你的问题,请参考以下文章

mysql和mariadb中字段拼接类型有两个或多个字段或者一个字段和一个固定字符串拼接

在我的 Rails 项目中使用 MariaDB 而不是 MySQL

C# 使用 MySql 和 MariaDB

Docker MariaDB/Mysql 转储

MariaDB/MySQL中的变量

mariadb/mysql:如何将 BLOB 的/UNPACK 部分转换为整数或双精度等