提高具有大量行列(50列,5mm行)的数据库表的查询性能
我们正在为我们的用户数据构建一个缓存解决方案。数据目前存储在sybase中,分布在5到6个表中,但使用hibernate查询基于它的顶层服务,我们的性能非常差。为了将数据加载到缓存中,需要10到15小时的时间。提高具有大量行列(50列,5mm行)的数据库表的查询性能
因此,我们决定创建一个50-60列和5毫米行到另一个关系数据库(UDB)的非规格化表,首先填充该表,然后使用JDBC从新的非规格化表填充缓存,以便构建时间我们缓存较低。这给了我们更多的性能,现在我们可以在大约一个小时内创建缓存,但这也不符合我们在5分钟内构建缓存的要求。使用以下查询查询denormlized表
select * from users where user id in (...)
此处的用户标识是主键。我们也试过了一个查询
select * from user where user_location in (...)
并且在位置上也创建了一个非唯一索引,但这也没有帮助。
所以有一种方法可以使查询更快。如果不是的话,我们也可以考虑使用一些NOSQL解决方案。
哪种NOSQL解决方案适合我们的需求。除了大桌子之外,我们每天还会在桌子上做1毫米左右的更新。
我已阅读关于mongo db,似乎它可以工作,但没有人发布过mongo db的许多行和如此多的每日更新的任何经验。
请让我们知道您的想法。
这里的简短答案与MongoDB有关,是的 - 它可以用这种方式在RDBMS前创建一个非规范化缓存。其他人已经使用MongoDB将类似(和更大)大小的数据集存储到您描述的大小,并且可以将该大小的数据集保存在RAM中。还有一些细节在这里失踪在数据方面,但它肯定是无法超越的MongoDB的能力,是目前比较常用的实现方式之一:
http://www.mongodb.org/display/DOCS/The+Database+and+Caching
的关键是你的工作的大小数据集以及您的可用RAM(MongoDB将数据映射到内存中)。对于更大的解决方案,写大量缩放以及类似的问题,可以采用多种方法(分片,副本集)。
由于详细程度很难确定,MongoDB将满足您的所有需求,但考虑到其他人已经完成了类似的实现,并且根据给出的信息,没有任何理由它也不能工作。
对我来说,似乎你有一个相当基本的问题,现在你试图用许多额外的技术堆栈杀死它。为什么您首先需要缓存中的所有数据?你对这些数据进行了哪些操作?等我怀疑您提供的信息是否足以满足合格的答案... –
我们将主要在启动时从这些数据中读取数据,然后在创建新用户帐户或更改其数据或帐户时定期更新数据被删除 – user1162439
所有的数据一次??为什么你需要内存中的数据?现代数据库在访问磁盘上的数据方面非常高效......我不明白你想要做什么 –