如何让MySQL数据库在内存中完全运行?

时间:2012-05-21 20:47:38

标签: mysql database

我注意到我的数据库服务器支持Memory数据库引擎。我想创建一个我已经使运行InnoDB的数据库完全在内存中运行以获得性能。

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

7 个答案:

答案 0 :(得分:22)

假设您了解使用评论中提到的MEMORY引擎的后果,以及here,以及您通过搜索找到的其他一些内容(没有交易安全,锁定问题等) - 您可以按以下步骤操作:

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

答案 1 :(得分:16)

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

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

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

我还写了一篇文章,更详细地解释了设置。我使用此设置进行数据库测试。

http://jotschi.de/2014/02/03/high-performance-mysql-testdatabase/

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

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

答案 2 :(得分:8)

Memory Engine不是您正在寻找的解决方案。你丢失了首先进入数据库的所有东西(即ACID)。

以下是一些更好的选择:

  1. 不要使用联接 - 很少有大型应用程序这样做(即谷歌,Flickr,NetFlix),因为它吸引了大量的联接。
  2.   

    LEFT [OUTER] JOIN可能比同等的子查询更快,因为   服务器可能能够更好地优化它 - 事实并非如此   仅针对MySQL服务器。

         

    - The MySQL Manual

    1. 确保您查询的列具有索引。使用EXPLAIN确认它们正在被使用。
    2. 使用并增加索引的Query_Cache和内存空间,使其在内存中存储并存储频繁的查找。
    3. 对您的架构进行反规范化,尤其是对于简单连接(即从barMap获取fooId)。
    4. 最后一点是关键。我曾经喜欢加入,但后来不得不在100M +行的几张桌子上运行连接。不好。最好将您加入的数据插入到目标表中(如果不是太多)并查询索引列,您将在几毫秒内得到您的查询。

      我希望有人帮忙。

答案 3 :(得分:6)

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

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

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

答案 4 :(得分:4)

  

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

在直接回答您的问题的这一部分时,您可以发出ALTER TABLE tbl engine=InnoDB;并在适当的引擎中重新创建表格。

答案 5 :(得分:2)

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

You can find the official MySQL Cluster documentation here.

答案 6 :(得分:1)

其他想法:

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

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