我正在编写一些软件,需要将数据从分层类型的格式展平为表格格式。我不想每次都用一种编程语言来完成并提供服务,而是想将结果缓存几秒钟,然后使用 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 引擎,由于表锁,我必须等待完成。
临时 临时表除了在数据库连接关闭时被删除之外,还有什么好处吗?