将一个大型键值存储从MySQL迁移到NoSQL数据库,可以期望获得显著的性能提升吗?

7
我正在开发一个保存大型科学数据集的数据库。典型的使用场景是每天会向数据库写入约5GB的新数据,同时也会删除5GB的数据。总数据库大小将约为50GB。我运行的服务器无法在内存中存储整个数据集。
我已经设计了这个数据库,使主数据表只是一个键/值存储,包括唯一的ID和值。
查询通常是针对大约100个连续值,例如:SELECT Value WHERE ID BETWEEN 7000000 AND 7000100; 我目前正在使用MySQL / MyISAM,这些查询需要大约0.1-0.3秒的时间,但最近我意识到MySQL可能不是基本上是一个大型键/值存储的最佳解决方案。
在开始安装新软件并重写整个数据库之前,我想大致了解一下使用NoSQL DB(例如Tokyo Tyrant,Cassandra,MongoDB)而不是MySQL进行这些检索时是否有可能看到显着的性能提升。
谢谢

2
在放弃关系型数据库之前,我想要针对MySQL/Innodb和PostgreSQL进行性能分析。我还想确保表上有适当的索引。 - tpdi
回复:索引,我的表有两列:ID BIGINT;Value FLOAT;而且我把ID作为主键,因为我的查询总是使用where ID between ... - Pete W
哇!一个两列表格中有50GB的数据。在这种情况下,我认为0.1到0.3秒的速度是非常不错的。如果这是我们关心的事情,也许你可以告诉我们你在这个几乎打破记录的表格中保存了什么? - Brian Hooper
如果你转向Mongodb,你可以将数据库分片到多台机器上,并且整个数据集将适合内存,这将使它变得非常快。在MongoDB中进行分片可以处理范围查询。当然,那些额外的机器需要花费一定的资金,这取决于你。你也可以尝试使用SSD。 - TTT
Brian:我应该说目前我没有使用完整的数据集,所以我的0.1-0.3秒检索仅适用于总表大小略大于5GB的情况(但最终将达到50GB)。需要注意的是,我的当前服务器只有512MB的RAM!这些数据是一组地球物理卫星数据。TTT:关于分片的观点很好。那绝对是一个选项。 - Pete W
任何键值对NoSQL数据库都应该适合您的需求,特别是如果您有其他机器可以组成集群。 - Zanson
3个回答

3
请考虑使用OrientDB,它使用RB+Tree算法的索引。在我的测试中,处理100GB的数据库读取100个项目只需0.001-0.015秒,在我的笔记本电脑上,但这取决于键/值在索引内的分布情况。您可以在不到1小时的时间内进行自己的测试。
不好的消息是,OrientDB尚不支持集群配置(计划于2010年9月实现)。

2

我认为Cassandra在数据集太大无法放入内存时比基于B树的系统(如TC,MySQL或MongoDB)表现更好。当然,Cassandra也被设计成如果需要更高的性能,则可以轻松添加更多机器以支持工作负载。


2
我在生产环境中使用MongoDB来执行写入密集操作,我做的写入和读取操作远远超过你提到的速率。我的数据库大小约为90GB,单个实例(亚马逊m1.xlarge)可以达到100QPS。基于一个拥有150M条记录的数据库,典型的键值查询大约需要1-15毫秒时间,在高负载下查询时间可能会增加到30-50毫秒。
无论如何,200毫秒对于键/值存储来说太慢了。
如果你只使用单个普通服务器,我建议使用mongoDB,因为它非常高效且易于学习。 如果你正在寻找分布式解决方案,可以尝试任何Dynamo克隆: Cassandra(Facebook)或Project Volemort(LinkedIn)是最流行的。 请注意,寻求强一致性会使这些系统变得更慢。

1
谢谢 - 我现在正在使用MongoDB、Tokyo Tyrant和Cassandra进行一些基准测试。我肯定能看到查询时间有了很大的改善。然而,需要注意的是,相比于MySQL的LOAD INFILE,批量插入并不是那么快速。 - Pete W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接