我正在研究一个非常大的表(约1亿行,35列),它目前存储在SQL db中,但我正在运行的查询(它们各种各样)运行得非常非常慢.. 所以我明白我应该转向NoSQL db。问题是:
如何判断哪个(NoSQL)数据库最适合我?
如何将当前的SQL表移动到新的NoSQL方案?
或者我应该留在SQL中并对其进行微调?
更多细节:不会添加/删除行,这是历史数据,所有分析都将在该表上完成。计划对其进行各种查询。数据是数字。
答案 0 :(得分:7)
有些值得深思的话:
在SQL的“甜蜜点”中,100M行井。您可以通过x10增长,并且仍然可以确保SQL能够通过相当简单的努力为您提供支持。
NoSQL并不是解决大规模性能问题的灵丹妙药。它提供了一系列权衡,经过精心规划,可以提供更好的结果。但是,如果你没有完全理解SQL中的性能问题,那么在NoSQL环境中做出正确设计决策的机会很小。
NoSQL系统的一个常见权衡是,它们通常在查询时提供 less 灵活性,以换取模式管理的更大灵活性。你提到你的查询是“各种各样的” - 如果它们真的是变化的,或者更重要的是 - 经常变化 - 那么转移到NoSQL系统会让你陷入痛苦的世界。特别是如果您还不熟悉该技术。
底线 - 你没有做任何明显“超出”SQL功能的事情,你的问题可能更多地是由于低效的实现而不是任何固有的平台限制。转移到NoSQL系统不会神奇地解决您的任何问题,并且可能会引入新的问题。
答案 1 :(得分:5)
我经常使用具有9亿行的SQL Server 2012表。该表每2分钟添加一行,每天总计约200K。我可以查询此表并在几秒钟内返回行(使用聚簇索引/ PK)。我还可以查询其中一个索引,并在几秒或更短的时间内得到结果。
所以,这一切都要确保你的索引设置正确,并且正在使用!!根据正在生成的查询计划检查您的查询,并确保正在进行搜索。
可能有充分的理由转移到NoSQL或类似的东西。但是,由于您认为自己无法在SQL Server中获得良好的性能,在确保您已经完成了所有可以做的事情以便首先提高性能之前,因此转向NoSQL并不是一个好理由。
答案 2 :(得分:0)
如果您对未编制索引的列运行查询,则速度非常慢。您可以添加更多索引以加快速度。如果您的数据库是静态的,这应该可以。
一个主要的加速是使用map-reduce查询,其中聚合由多个进程或计算机执行。可以以这种方式使用像MongoDB这样的NoSQL数据库。但即便是MySQL现在也拥有群集功能:http://www.mysql.de/products/cluster/scalability.html。 SQL Server也可以进行集群化。
所以我想最好的第一个镜头是优化表中的索引到查询。应该对查询的每个参数列(比较,计数......)等进行索引。
如果这没有做得更好,你可能会计算并计算很多,你应该使用map-reduce作业和一个可以像MongoDB一样处理这个问题的数据库:http://docs.mongodb.org/manual/aggregation/
我希望这会有所帮助