我注意到我的数据库服务器支持内存数据库引擎。我想让一个我已经运行 InnoDB 的数据库完全在内存中运行以提高性能。
我怎么做?我探索了 PHPMyAdmin,但找不到“更改引擎”功能。
假设您了解评论中提到的使用 MEMORY 引擎的后果,以及此处以及您可以通过搜索找到的其他一些引擎(无事务安全、锁定问题等) - 您可以按照以下步骤进行操作:
MEMORY 表的存储方式与 InnoDB 不同,因此您需要使用导出/导入策略。首先使用SELECT * FROM tablename INTO OUTFILE 'table_filename'
. 创建 MEMORY 数据库并使用以下语法重新创建您将使用的表:CREATE TABLE tablename (...) ENGINE = MEMORY;
. 然后,您可以使用LOAD DATA INFILE 'table_filename' INTO TABLE tablename
每个表导入数据。
也可以将 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 负载。
内存引擎不是您正在寻找的解决方案。您首先丢失了进入数据库的所有内容(即 ACID)。
这里有一些更好的选择:
LEFT [OUTER] JOIN 可以比等效的子查询更快,因为服务器可能能够更好地优化它——这一事实并非仅适用于 MySQL 服务器。
- MySQL 手册
最后一点是关键。我曾经喜欢联接,但后来不得不在几张 100M+ 行的表上运行联接。不好。最好将您要加入的数据插入该目标表(如果不是太多)并查询索引列,您将在几毫秒内获得查询。
我希望那些帮助。
如果您的数据库足够小(或者如果您添加了足够的内存),您的数据库将有效地在内存中运行,因为您的数据将在第一次请求后被缓存。
更改数据库表定义以使用内存引擎可能比您需要的更复杂。
如果您有足够的内存来使用引擎将表加载到内存中,那么您就有足够的内存MEMORY
来调整 innodb 设置以缓存所有内容。
“我该怎么做?我探索了 PHPMyAdmin,但找不到“更改引擎”功能。”
作为对这部分问题的直接回应,您可以发出 an ALTER TABLE tbl engine=InnoDB;
,它将在适当的引擎中重新创建表。
代替内存存储引擎,可以考虑 MySQL Cluster。据说它提供了类似的性能,但支持磁盘支持的操作以提高耐用性。我没有尝试过,但它看起来很有希望(并且已经开发了很多年)。
其他想法:
Ramdisk - 设置 MySQL 用作 RAM 磁盘的临时驱动器,非常容易设置。
memcache - memcache 服务器易于设置,使用它来存储 X 时间量的查询结果。