我们的服务器(Debian上的几个Java应用程序)处理应该是的传入数据(GNSS观察):
有时候(可能一天几次)将从数据库中提取大约数百万个存档记录。记录大小约为12个双精度字段+时间戳和一些ID。没有更新; DELETE是非常罕见的但是很大。传入流量高达每秒100条记录。所以我不得不为这些数据选择存储引擎。
我尝试使用MySQL(InnoDB)。一个应用程序插入,其他应用程序不断检查最后一个记录ID,如果更新,则获取新记录。这部分工作正常。但我遇到了以下问题:
基于文件的存储可以正常工作(因为DB中间没有插入,选择大多是'WHERE ID = 1和2000和3000之间的时间',但还有其他问题:
您能建议一些合适的数据库引擎(SQL首选,但不是必需的)?也许有可能微调MySQL以减少记录大小并获取连续数据条的时间?
MongoDB是不可接受的,因为在32位计算机上数据库大小是有限的。任何不能为最近插入的数据提供快速访问的引擎也是不可接受的。
答案 0 :(得分:3)
我建议在MySQL上使用TokuDB存储引擎。它可以免费获得高达50GB的用户数据,并且它的定价模式并不可怕,使其成为存储大量数据的绝佳选择。
与InnoDB和MyISAM相比,它具有更高的插入速度,并且随着数据集的增长而扩展得更好(一旦工作数据集不适合RAM,其性能取决于HDD子系统的I / O,InnoDB就会恶化)。
它也符合ACID并支持多个聚簇索引(对于您计划进行的大规模DELETE而言,这将是一个很好的选择)。此外,支持热架构更改(ALTER TABLE不会锁定表,并且对巨大的表进行快速更改 - 我说的是几十秒内改变了千兆字节大小的表)。
从我个人的角度来看,由于TokuDB的压缩,我的磁盘使用量减少了大约5-10倍,并且比MyISAM或InnoDB快得多。 虽然听起来我正在试图宣传这个产品 - 我不是,但这简直太令人惊讶了,因为你可以使用单片数据存储,而不需要像跨节点划分来扩展写入等昂贵的扩展计划。
答案 1 :(得分:2)
从磁盘加载数百万条记录需要花费多长时间。您的32位要求意味着您可以使用多少RAM来用于基于内存的数据结构。但是,如果您想使用MySQL,您可以使用多种表类型获得良好的性能。
如果您需要非常快速的非阻塞插入。您可以使用黑洞表类型和复制。发生插入的服务器具有黑洞表类型,该表类型复制到表为Innodb或MyISAM的另一台服务器。
由于你不做UPDATE,我认为在这种情况下MyISAM会比Innodb更好。您可以为MyISAM使用MERGE表类型(不适用于Innodb)。不确定你的数据集是什么样的,但你每天可以有1个表(小时,星期?),那么你的MERGE表就是这些表的超集。假设您希望按日删除旧数据,只需将MERGE表重新声明为不包括旧表。这个动作是即时的。删除旧表也非常快。
要检查新数据,您可以直接查看“今日”表,而不是通过MERGE表。