提高具有大量列和行(50列,5mm行)的数据库表的查询性能

时间:2012-01-21 15:40:04

标签: sql mongodb database-performance udb

我们正在为用户数据构建缓存解决方案。这些数据目前存储在sybase中,分布在5-6个表中,但使用hibernate构建在它之上的查询服务,我们的性能非常差。为了将数据加载到缓存中,它将需要10-15个小时的范围。

因此我们决定在另一个关系数据库(UDB)中创建一个50-60列和5mm行的非规范化表,首先填充该表,然后使用JDBC从新的非规范化表填充缓存,以便构建我们的时间缓存较低。这给了我们更好的性能,现在我们可以在大约一个小时内构建缓存,但这也不符合我们在5分钟内构建缓存的要求。使用以下查询

查询denormlized表
select * from users where user id in (...)

此处用户ID是主键。我们还尝试了一个查询

select * from user where user_location in (...) 

并在位置上创建了一个非唯一索引,但这也没有帮助。

有没有办法让我们更快地进行查询。如果没有,那么我们也可以考虑一些NOSQL解决方案。

哪种NOSQL解决方案适合我们的需求。除了大桌子,我们每天都会在桌子上做大约1mm的更新。

我已经阅读过关于mongo db的内容,看起来它可能会有效,但是没有人发布任何mongo db有这么多行和每日更新的经验。

请告诉我们您的想法。

1 个答案:

答案 0 :(得分:4)

这里关于MongoDB的简短答案是肯定的 - 它可以用这种方式在RDBMS前面创建非规范化缓存。其他人使用MongoDB将类似(和更大)尺寸的数据集存储到您描述的数据集中,并且可以在RAM中保留该大小的数据集。这里有一些关于您的数据的细节,但它肯定不会超出MongoDB的功能,并且是更常用的实现之一:

http://www.mongodb.org/display/DOCS/The+Database+and+Caching

密钥将是工作数据集的大小,因此是可用的RAM(MongoDB将数据映射到内存中)。对于更大的解决方案,编写大量扩展和类似问题,可以采用多种方法(分片,副本集)。

根据给定的详细程度,很难确定MongoDB是否满足您的所有要求,但鉴于其他人已经完成了类似的实施并且根据给出的信息,没有理由它也无法工作。