我应该使用哪个数据库?

6

我现在正在构建一个应用程序,需要存储和处理大量数据。所以我现在正在苦恼这个问题 - 我应该使用哪种数据库。

我的要求是:

  • 每秒处理多达~100,000个插入命令(有时来自不同的线程)。 100,000是峰值; 大部分时间内,数量将在几百到几千之间。
  • 存储数百万条记录。
  • 尽快查询数据。
  • 部分数据属性对于每个实体都会更改,这符合非关系型数据库的行为,而不是关系型数据库。但是,可能属性的总和并不巨大,因此可以将其表示为关系数据库中的列(如果以这种方式更快)。
  • 更新命令很少发生。

你会推荐我使用哪种数据库呢?

谢谢!

更新:我使用的操作系统不是Windows。我认为如果SQL Server是最受推荐的数据库,那么我可能会切换,但从你们的回复来看,情况并非如此。

关于预算 - 我将从最便宜的选项开始,我想一旦公司拥有更多资金和更多用户,情况就会改变。

没有人推荐使用no-sql数据库。它们真的不适合这种要求吗?


1
你使用的操作系统和开发工具是什么? - jnoss
2
我不能告诉你应该使用哪种数据库,但我建议你通过某种批量上传方式提高性能。现在我们有更好的机器,并不意味着你应该接受极高水平的压力 :) - riwalk
3
我想查看一个关于数据库建议的问题,其中写着“以体面的方式查询数据 - 不是飞快的,而是更为缓慢的...” - OMG Ponies
5个回答

3
答案取决于进一步提问,例如您想花多少钱、使用什么操作系统以及公司内部的专业知识水平等。
我所知道的可以处理如此大规模数据的数据库包括:DB2、Oracle、Teradata和SQL Server。MySQL也可能是一个选项,但我不确定它的性能能力如何。
肯定还有其他设计用于处理您所建议的大规模数据的数据库,您可能需要研究这些数据库。
因此,如果您的操作系统不是Windows,则可以排除SQL Server。
如果您想省钱,MySQL可能是一个选择。
DB2和Oracle都是成熟的数据库系统。如果您的系统是主机(IBM 370),我建议使用DB2,但对于基于Unix的系统,两者都可以考虑。
我不太了解Teradata,但我知道它专门设计用于处理大量数据,因此可能更接近您所寻找的内容。
更完整的选择列表可以在此处找到:http://en.wikipedia.org/wiki/List_of_relational_database_management_systems 这里有一个数据库的良好比较:http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems 每秒10万次插入是一个巨大的数字,无论您选择什么,您都需要在硬件上花费大量资金来处理这个问题。

在DB2和Oracle之间,您为什么建议在IBM主机上使用DB2? - Moeb

2
这不是关于选择哪个数据库的问题,而是关于您的技能和经验的问题。
如果您认为只用一台物理机就可以解决问题,那么您是错误的。如果您知道应该使用多台机器,那么您为什么要问数据库呢?数据库并不像您处理它的方式那样重要。
首先从单服务器上的只写数据库开始,并纵向扩展。使用多个只读服务器并横向扩展(在这里,文档数据库几乎总是安全的选择)。CQRS概念是您即将提出的问题。

0
“每秒处理高达100,000个插入命令” - 这是峰值还是正常操作?如果是正常操作,那么你所存储的“数百万条记录”可能会变成数十亿条...
对于这样的问题,我认为更有用的是进一步了解业务“问题”-因为这些都是非平凡的要求!问题是是否证明了这种“蛮力”方法,或者是否有其他方法来实现相同的目标。
如果需要,您可以考虑是否有聚合/转换数据的方法(例如批量加载数据/丢弃对同一记录的多次更新/加载到多个数据库中,然后作为一组ETL的组合进行聚合)以使管理此体积更容易。

0

我首先会担心的是你的磁盘布局,因为你有混合工作负载(OLTP和OLAP),所以非常重要的是正确地调整和放置你的磁盘以实现这种吞吐量,如果你的IO子系统无法处理负载,那么你使用什么数据库都没有用。

此外,也许那100,000次每秒的插入可以进行批量加载,顺便说一下,每秒100,000行相当于仅在12小时内就有72,000,000行,所以也许你想存储数十亿行?


并没有真正回答问题。 - Russ

0

你可能无法处理每秒100k个单独的插入操作,你肯定需要将它们批量处理成更可管理的数量。

一个线程也无法执行那么多的命令,所以我预计会有100-1000个线程执行这些插入操作。

根据你的应用程序,你可能还需要某种高可用性。除非你正在做类似科学应用的东西。

我的建议是雇佣一个有可信答案的人 - 最好是曾经做过的人 - 如果你不知道,你将无法开发应用程序。雇佣一位能够回答这个问题的高级开发人员。如果你愿意,可以在面试中问他们。


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