59

我注意到我的数据库服务器支持内存数据库引擎。我想让一个我已经运行 InnoDB 的数据库完全在内存中运行以提高性能。

我怎么做?我探索了 PHPMyAdmin,但找不到“更改引擎”功能。

4

7 回答 7

28

假设您了解评论中提到的使用 MEMORY 引擎的后果,以及此处以及您可以通过搜索找到的其他一些引擎(无事务安全、锁定问题等) - 您可以按照以下步骤进行操作:

MEMORY 表的存储方式与 InnoDB 不同,因此您需要使用导出/导入策略。首先使用SELECT * FROM tablename INTO OUTFILE 'table_filename'. 创建 MEMORY 数据库并使用以下语法重新创建您将使用的表:CREATE TABLE tablename (...) ENGINE = MEMORY;. 然后,您可以使用LOAD DATA INFILE 'table_filename' INTO TABLE tablename每个表导入数据。

于 2012-05-21T21:08:18.840 回答
26

也可以将 MySQL 数据目录放在tmpfs中,从而加快数据库写入和读取调用。这可能不是最有效的方法,但有时您不能只更改存储引擎。

这是我的 MySQL 数据目录的 fstab 条目

none            /opt/mysql/server-5.6/data  tmpfs   defaults,size=1000M,uid=999,gid=1000,mode=0700          0       0

您可能还想查看innodb_flush_log_at_trx_commit=2设置。也许这会充分加速你的 MySQL。

innodb_flush_log_at_trx_commit 更改 mysql 磁盘刷新行为。当设置为 2 时,它只会每秒刷新一次缓冲区。默认情况下,每次插入都会导致刷新,从而导致更多的 IO 负载。

于 2014-07-30T12:14:55.207 回答
14

内存引擎不是您正在寻找的解决方案。您首先丢失了进入数据库的所有内容(即 ACID)。

这里有一些更好的选择:

  1. 不要使用连接 - 很少有大型应用程序会这样做(例如 Google、Flickr、NetFlix),因为它很适合大量连接。

LEFT [OUTER] JOIN 可以比等效的子查询更快,因为服务器可能能够更好地优化它——这一事实并非仅适用于 MySQL 服务器。

- MySQL 手册

  1. 确保您要查询的列具有索引。使用 EXPLAIN 确认它们正在被使用。
  2. 使用并增加索引的 Query_Cache 和内存空间,以将它们放入内存并存储频繁的查找。
  3. 非规范化您的模式,特别是对于简单的连接(即从 barMap 获取 fooId)。

最后一点是关键。我曾经喜欢联接,但后来不得不在几张 100M+ 行的表上运行联接。不好。最好将您要加入的数据插入该目标表(如果不是太多)并查询索引列,您将在几毫秒内获得查询。

我希望那些帮助。

于 2012-05-21T21:16:04.767 回答
6

如果您的数据库足够小(或者如果您添加了足够的内存),您的数据库将有效地在内存中运行,因为您的数据将在第一次请求后被缓存。

更改数据库表定义以使用内存引擎可能比您需要的更复杂。

如果您有足够的内存来使用引擎将表加载到内存中,那么您就有足够的内存MEMORY来调整 innodb 设置以缓存所有内容。

于 2012-05-21T21:12:46.047 回答
5

“我该怎么做?我探索了 PHPMyAdmin,但找不到“更改引擎”功能。”

作为对这部分问题的直接回应,您可以发出 an ALTER TABLE tbl engine=InnoDB;,它将在适当的引擎中重新创建表。

于 2014-03-11T23:13:11.513 回答
2

代替内存存储引擎,可以考虑 MySQL Cluster。据说它提供了类似的性能,但支持磁盘支持的操作以提高耐用性。我没有尝试过,但它看起来很有希望(并且已经开发了很多年)。

你可以在这里找到官方的 MySQL Cluster 文档。

于 2013-09-24T23:04:13.820 回答
1

其他想法:

Ramdisk - 设置 MySQL 用作 RAM 磁盘的临时驱动器,非常容易设置。

memcache - memcache 服务器易于设置,使用它来存储 X 时间量的查询结果。

于 2018-06-16T01:53:10.247 回答