我注意到我的数据库服务器支持Memory数据库引擎.我想创建一个我已经使运行InnoDB的数据库完全在内存中运行以获得性能.
我怎么做?我探索了PHPMyAdmin,我找不到"更改引擎"功能.
Pin*_*nyM 26
假设您了解使用评论中提到的MEMORY引擎的后果,以及此处以及您通过搜索找到的其他一些内容(无交易安全性,锁定问题等) - 您可以按以下步骤操作:
MEMORY表的存储方式与InnoDB不同,因此您需要使用导出/导入策略.首先将每个表分别转储到一个文件中SELECT * FROM tablename INTO OUTFILE 'table_filename'
.创建MEMORY数据库并使用以下语法重新创建您将使用的表:CREATE TABLE tablename (...) ENGINE = MEMORY;
.然后,您可以使用LOAD DATA INFILE 'table_filename' INTO TABLE tablename
每个表导入数据.
Jot*_*chi 17
也可以将MySQL数据目录放在tmpfs中,从而加快数据库的写入和读取调用.它可能不是最有效的方法,但有时你不能只改变存储引擎.
这是我的MySQL数据目录的fstab条目
none /opt/mysql/server-5.6/data tmpfs defaults,size=1000M,uid=999,gid=1000,mode=0700 0 0
Run Code Online (Sandbox Code Playgroud)
我还写了一篇文章,更详细地解释了设置.我使用此设置进行数据库测试.
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负载.
Memory Engine不是您正在寻找的解决方案.你丢失了首先进入数据库的所有东西(即ACID).
以下是一些更好的选择:
LEFT [OUTER] JOIN可以比等效的子查询更快,因为服务器可能能够更好地优化它 - 这一事实并非仅针对MySQL Server.
- MySQL手册
最后一点是关键.我曾经喜欢加入,但后来不得不在100M +行的几张桌子上运行连接.不好.最好将您加入的数据插入到目标表中(如果不是太多)并查询索引列,您将在几毫秒内获得查询.
我希望那些帮助.
如果您的数据库足够小(或者如果您添加了足够的内存),您的数据库将在内存中有效运行,因为您的数据将在第一次请求后缓存.
更改数据库表定义以使用内存引擎可能比您需要的更复杂.
如果你有足够的内存来使用MEMORY
引擎将表加载到内存中,那么你就足以调整innodb设置来缓存所有内容.
“我该怎么做?我浏览了 PHPMyAdmin,但找不到“更改引擎”功能。”
为了直接回答您问题的这一部分,您可以发出 an ALTER TABLE tbl engine=InnoDB;
,它会在适当的引擎中重新创建表。