我注意到我的数据库服务器支持Memory数据库引擎。我想创建一个我已经使运行InnoDB的数据库完全在内存中运行以获得性能。
我该怎么做?我探索了PHPMyAdmin,但我找不到“更改引擎”的功能。
答案 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)。
以下是一些更好的选择:
LEFT [OUTER] JOIN可能比同等的子查询更快,因为 服务器可能能够更好地优化它 - 事实并非如此 仅针对MySQL服务器。
最后一点是关键。我曾经喜欢加入,但后来不得不在100M +行的几张桌子上运行连接。不好。最好将您加入的数据插入到目标表中(如果不是太多)并查询索引列,您将在几毫秒内得到您的查询。
我希望有人帮忙。
答案 3 :(得分:6)
如果您的数据库足够小(或者如果您添加了足够的内存),您的数据库将在内存中有效运行,因为您的数据将在第一次请求后缓存。
更改数据库表定义以使用内存引擎可能比您需要的更复杂。
如果你有足够的内存可以使用MEMORY
引擎将表加载到内存中,那么你就足以调整innodb设置来缓存所有内容。
答案 4 :(得分:4)
“我该怎么做?我探索了PHPMyAdmin,我找不到”更改引擎“的功能。”
在直接回答您的问题的这一部分时,您可以发出ALTER TABLE tbl engine=InnoDB;
并在适当的引擎中重新创建表格。
答案 5 :(得分:2)
代替内存存储引擎,可以考虑使用MySQL Cluster。据说它具有类似的性能,但支持磁盘支持的操作以提高耐用性。我没试过,但它看起来很有希望(并且已经开发了很多年)。
答案 6 :(得分:1)
其他想法:
Ramdisk - 设置MySQL用作RAM磁盘的临时驱动器,非常容易设置。
memcache - memcache服务器易于设置,用它来存储查询结果的X时间。