gpt4 book ai didi

RAMdisk 上的 MySQL 内存引擎与 InnoDB

转载 作者:可可西里 更新时间:2023-11-01 07:37:24 28 4
gpt4 key购买 nike

我正在编写一些软件,需要将数据从分层格式扁平化为表格格式。我不想每次都用一种编程语言来完成并提供服务,而是想将结果缓存几秒钟,然后使用 SQL 进行排序和过滤。在使用时,我们说的是在那几秒钟内进行 400,000 次写入和 1 或 2 次读取。

每个表格将包含 3 到 15 列。每行将包含 100 字节到 2,000 字节的数据,但在某些情况下,某些行可能会达到 15,000 字节。如有必要,我可以剪辑数据以保持理智。

我正在考虑的主要选项是:

MySQL 的内存引擎

一个不错的选择,几乎是专门为我的用例编写的!但是……“MEMORY 表使用固定长度的行存储格式。可变长度类型(例如 VARCHAR)使用固定长度存储。MEMORY 表不能包含 BLOB 或 TEXT 列。” - 不幸的是,我的文本字段的长度可能最多可达 10,000 个字符 - 即使是这个数字也没有特别限制。当我循环进行展平时,我可以根据文本列的最大长度调整 varchar 长度,但这并不完全优雅。另外,对于我偶尔的 15,000 个字符的行,这是否意味着我需要为数据库中的每一行分配 15,000 个字符?如果有 100,000 行,那就是 1.3 GB,不包括开销!

RAMDisk 上的 InnoDB

这是为了在云上运行,我可以轻松地启动具有 16gb 内存的服务器,配置 MySQL 以写入 tmpfs 并使用全功能的 MySQL。我对此的关注是空间。虽然我确定工程师已经编写了内存引擎来防止消耗所有临时存储和服务器崩溃,但我怀疑该解决方案是否知道何时停止。如果采用数据库格式,我的 2,000 字节数据将占用多少实际空间?我如何监控它?

奖励问题

索引事实上,我会提前知道哪些列需要过滤和排序。我可以在插入之前设置一个索引,但是老实说,我可以期望在 ram 磁盘上获得什么样的性能提升?索引增加了多少额外开销?

插入我假设用一个查询插入多行会更快。但是一个查询或一系列大型查询存储在内存中,我们正在写入内存,所以如果我这样做,我会暂时需要双倍的内存。然后我们讨论一次做一个或两个或一百个,并且必须等待它完成才能处理更多...... InnoDB 不会锁定表但我担心发送两个查询彼此太近并且混淆MySQL。这是一个合理的担忧吗?由于表锁,使用 MEMORY 引擎我必须等待完成。

临时除了在数据库连接关闭时临时表被删除之外,临时表还有什么好处吗?

最佳答案

我建议你使用 MyISAM。为您的查询创建具有适当索引的表。然后禁用 key 、加载表并启用 key 。

我建议您为您的系统制定这样的规程。我非常有效地使用了类似的纪律。

保留表格的两份副本。调用一个 table_active 和第二个 table_loading

当需要加载数据的新副本时,使用这样的命令。

  ALTER TABLE table_loading DISABLE KEYS;
/* do your insertions here, to table_loading */
/* consider using LOAD DATA INFILE if it makes sense. */
ALTER TABLE table_loading ENABLE KEYS; /* this will take a while */
/* at this point, suspend your software that's reading table_active */
RENAME TABLE table_active TO table_old;
RENAME TABLE table_loading TO table_active;
/* now you can resume running your software */
TRUNCATE TABLE table_old;
RENAME TABLE table_old TO table_loading;

或者,您可以DROP TABLE table_old; 并为table_loading 创建一个新表,而不是上次重命名。

这个双表(双缓冲)策略应该工作得很好。它会产生一些延迟,因为您正在读取表格的软件将在旧副本上运行。但是您将避免从未完全加载的表中读取数据。

我建议使用 MyISAM,因为您不会用完 RAM 并崩溃,而且您不会有固定行长的开销或事务开销。但您也可以考虑 MariaDB 和 Aria 存储引擎,它们在利用 RAM 缓冲区方面做得很好。

如果您确实使用 MEMORY 存储引擎,请务必调整您的 max_heap_table_size 系统变量。如果您的读取查询将使用索引范围扫描(顺序索引访问),请务必指定 BTREE 样式索引。看这里:http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html

关于RAMdisk 上的 MySQL 内存引擎与 InnoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17865520/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com