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

Joh*_*man 44 mysql database

我注意到我的数据库服务器支持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每个表导入数据.

  • 这实际上没有说明如何创建内存数据库或表. (39认同)
  • 至于@INTPnerd所做的,在重新创建表时,请使用以下语法:`CREATE TABLE someTable(...)ENGINE = MEMORY;` (9认同)
  • 使用mysqldump的输出进行@BetLamed还原将可以工作,但是比批量导入要慢得多,因为每个INSERT将需要单独运行(这会产生INSERT事务的开销)。批量导入可以避免这种情况,并且对于大量数据,可以期望更快。 (2认同)

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负载.


Jos*_*ust 9

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

以下是一些更好的选择:

  1. 不要使用连接 - 很少有大型应用程序这样做(即谷歌,Flickr,NetFlix),因为它很大程度上是连接.

LEFT [OUTER] JOIN可以比等效的子查询更快,因为服务器可能能够更好地优化它 - 这一事实并非仅针对MySQL Server.

- MySQL手册

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

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

我希望那些帮助.

  • 最后一点可能对性能有好处,但如果使用不当,它可能成为数据一致性和维护的杀手.触发器更新或类似的缓存复制策略可以提供帮助,但缓存非规范化数据的方式不应该被视为理所当然...... (11认同)
  • @PinnyM好点.这是必须决定什么是最重要的.RDBMS非常适合原子性和一致性,但不适用于扩展和性能,尤其是连接.6NF(Star Schema)非常正常,但加入快乐.您仍然可以以规范化的方式将数据保存在某些表中,并使用触发器和计划任务来更新规范化表(读/写)中的非规范化(只读)表. (3认同)
  • @Darwin 感谢您的反对票。选择一致性或规模。对于数十亿行,一致性通常不值得开销,这取决于您的用例(例如,就像我在工作中使用的所有 Col 商店一样)。 (2认同)
  • @Joseph你是对的,"挑选一致性或规模".大约99%的数据库最好具有一致性.大多数开发人员从未使用过大型数据库.大我的意思是,如不能有它在内存中以合理的价格.我相信你能获得今天的服务器用0.5至1 TB内存以合理的价格. (2认同)

Kev*_*ell 6

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

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

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


Sea*_*aux 5

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

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