我正在编写一款软件,需要将层次结构的数据转换为表格格式。我想要缓存结果几秒钟,并使用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 RAM的服务器,配置MySQL以写入tmpfs并使用完整功能的MySQL。我对此担心的是空间。虽然我相信工程师已经编写了内存引擎以防止消耗所有临时存储并使服务器崩溃,但我怀疑这种解决方案是否知道何时停止。当我的2,000字节数据以数据库格式存在时,实际占用多少空间?我该如何监控它?
额外问题
索引
事实上,我将事先知道需要按哪些列进行过滤和排序。我可以在插入之前设置索引,但除了在RAM磁盘上还能获得多少性能增益?索引会增加多少额外开销?
插入
我假设使用一个查询插入多行会更快。但是,这个查询或一系列大型查询都存储在内存中,而我们正在写入内存,因此如果我这样做,我暂时需要双倍的内存。那么我们谈论一次插入一两个或一百个,必须等待完成才能继续处理... InnoDB不锁定表格,但我担心发送两个查询太接近会混淆MySQL。这是一个有效的担忧吗?使用内存引擎时,必须等待完成,因为存在表锁。
临时
除了它们在关闭数据库连接时被删除之外,临时表还有什么好处吗?