数据库可以处理超过5亿行

我正在寻找一个可以处理的数据库(在合理的时间内在列上创build一个索引,并在less于3秒内为select查询提供结果)超过500万行。 Postgresql或Msql在低端机(核心2 CPU 6600,4GB,64位系统,Windows VISTA)处理如此大量的行?

更新:提出这个问题,我正在寻找哪些数据库我应该在低端机器上使用,以便提供结果来select带有where子句中指定的一个或两个字段的问题。 没有join。 我需要创build索引 – 它不能像在mysql上那么长时间 – 为我的select查询实现足够的性能。 这台机器是一台testing电脑来执行一个实验。

表架构:

create table mapper { key VARCHAR(1000), attr1 VARCHAR (100), attr1 INT, attr2 INT, value VARCHAR (2000), PRIMARY KEY (key), INDEX (attr1), INDEX (attr2) } 

MSSQL可以处理很多行就好了。 查询时间完全取决于许多因素,而不仅仅是简单的行数。

例如,它将取决于:

  1. 这些查询有多less个连接
  2. 你的索引设置得如何
  3. 机器里有多lessram
  4. 速度和处理器的数量
  5. 硬盘types和主轴转速
  6. 查询中返回的行的大小/数据量
  7. networking接口速度/延迟

有一个小的(less于10,000行)表,这将需要几分钟的时间来执行查询是非常容易的。 例如,使用大量的连接,where子句中的函数和Atom处理器上的零索引,总RAM为512MB。 ;)

需要更多的工作来确保所有的索引和外键关系都很好,优化查询以消除不必要的函数调用,只返回实际需要的数据。 另外,你需要快速的硬件。

这一切都归结为您想要花多less钱,开发团队的质量以及您所处理的数据行的大小。

更新由于问题的更改而更新。

这里的信息量还不足以给出真实世界的答案。 你将只需要testing它,并根据需要调整你的数据库devise和硬件。

例如,我可以非常容易地在具有这些规格的机器上的表格中有10亿行,并运行“selectAll(1)id从tableA(nolock)”查询并以毫秒为单位获得答案。 同样的道理,你可以执行一个“select * from tablea”查询,这需要一段时间,因为尽pipe查询执行的很快,但是通过线路传输所有数据需要一段时间。

要点是,你必须testing。 这意味着,build立服务器,创build一些表,并填充它们。 然后,您必须通过性能调优才能正确地查询和索引。 作为性能调优的一部分,您将发现不仅需要重新构造查询,而且还要根据锁确定机器的哪些部分可能需要更换(即:磁盘,更多ram,cpu等)并等待types。

我强烈build议你雇用(或合同)一个或两个DBA为你做这件事。

大多数数据库可以处理这个,这是关于你将如何处理这个数据,以及你如何做。 大量的内存将有所帮助。

我将从PostgreSQL开始,它是免费的,对RAM没有限制(与SQL Server Express不同),也没有许可证(处理器太多等)的潜在问题。 但这也是我的工作:)

几乎每个非愚蠢的数据库今天可以轻松处理十亿行。 即使在32位系统上也有5亿是可行的(尽pipe64位确实有帮助)。

主要问题是:

  • 你需要有足够的RAM。 多less就足够取决于你的查询。
  • 你需要有一个足够好的光盘子系统。 这很大程度上意味着如果你想做大型的select,那么一个单一的拼盘是完全不可能的。 需要许多主轴(或SSD)来处理IO负载。

Postgres和Mysql都可以轻松处理5亿行。 在适当的硬件上。

你要看的是数据库软件强加的表格大小限制 。 例如,在撰写本文时, MySQL InnoDB每个表的限制为64 TB ,而PostgreSQL 每个表 的限制为32 TB ; 不限制每个表的行数。 如果configuration正确,这些数据库系统不应该有处理数十亿或数千亿行(如果每行足够小),更不用说5亿行。

为了获得最好的性能,处理大量的数据,你应该有足够的磁盘空间和良好的磁盘性能 – 这可以通过合适的RAID磁盘来实现 – 大容量的内存加上一个快速的处理器(最好是服务器级Intel Xeon或AMD Opteron处理器)。 不用说,您还需要确保您的数据库系统已configuration为获得最佳性能,并且您的表格已正确编制索引。

下面的文章讨论在Microsoft SQL中导入和使用一个160 亿行的表。 http://sqlmag.com/t-sql/adventures-big-data-how-import-16-billion-rows-single-table

从文章:

以下是我的经验中的一些提示:

具有定义聚集索引的表中的数据越多,导入未sortinglogging的速度就越慢。 在某些时候,它变得太慢而不切实际。 如果要将表导出到尽可能最小的文件,请将其设置为原始格式。 这对于包含大多数数字列的表格效果最好,因为它们在二进制字段中比字符数据更紧凑。 如果你所有的数据都是字母数字的,你将不会以原生格式输出。 不允许数字字段中的空值可以进一步压缩数据。 如果你允许一个字段为空,那么这个字段的二进制表示将包含一个1字节的前缀,表示将会有多less字节的数据。 BCP计数器variables是一个4字节的整数,因此您不能使用超过2,147,483,647条logging的BCP。 我无法在MSDN或互联网上find任何这方面的参考。 如果您的表格包含超过2,147,483,647条logging,那么您必须将其以块forms导出或编写自己的导出例程。 在预先填充的表上定义聚簇索引需要大量的磁盘空间。 在我的testing中,我的日志在完成之前爆炸到原始表格大小的10倍。 使用BULK INSERT语句导入大量logging时,请包括BATCHSIZE参数,并指定一次提交多less条logging。 如果不包含此参数,则整个文件将作为单个事务导入,这需要大量的日志空间。 将数据导入到具有聚簇索引的表中的最快方法是首先对数据进行预处理。 然后可以使用带有ORDER参数的BULK INSERT语句将其导入。

即便如此,与数PB级的纳斯达克OMX数据库相比,这个数据库还要小得多,SQL Server上有数十兆字节(千兆兆字节)和数万亿行的数据库。

你检查过Cassandra吗? http://cassandra.apache.org/

正如前面提到的,现在几乎所有的数据库都可以处理这种情况 – 你要专注于你的磁盘I / O子系统。 您需要configurationRAID 0或RAID 0 + 1情况,尽可能多地引发问题。 另外,还要划分Log / Temp / Data逻辑驱动器的性能。

例如,假设您有12个驱动器 – 在您的RAID控制器中,我将创build3个RAID 0分区,每个分区有4个驱动器。 在Windows中(假设)将每个组格式化为逻辑驱动器(G,H,I) – 现在,当configurationSQLServer(假设)将tempdb分配给G时,日志文件为H,数据文件为I.

我没有太多的关于哪个是最好的系统使用的意见,但也许这个技巧可以帮助你获得一些你正在寻找的速度。

如果你打算做长的varcharstring的精确匹配,尤其是那些比索引所允许长的string,那么你可以做一个预先计算的散列:

 CREATE TABLE BigStrings ( BigStringID int identity(1,1) NOT NULL PRIMARY KEY CLUSTERED, Value varchar(6000) NOT NULL, Chk AS (CHECKSUM(Value)) ); CREATE NONCLUSTERED INDEX IX_BigStrings_Chk ON BigStrings(Chk); --Load 500 million rows in BigStrings DECLARE @S varchar(6000); SET @S = '6000-character-long string here'; -- nasty, slow table scan: SELECT * FROM BigStrings WHERE Value = @S -- super fast nonclustered seek followed by very fast clustered index range seek: SELECT * FROM BigStrings WHERE Value = @S AND Chk = CHECKSUM(@S) 

如果您没有进行完全匹配,这将无济于事,但在这种情况下,您可能会查看全文索引。 这将真正改变5亿行表上的查询速度。

我需要创build索引(这不需要像mysql上的年龄),以实现我的select查询的足够的性能

我不确定“创build”索引是什么意思。 这通常是一次性的事情。 现在,在加载大量数据时,通常会删除索引,加载数据,然后再添加索引,因此数据加载非常快。 然后,在对数据库进行更改时,索引将被更新,但不一定需要在每次运行查询时创build索引。

也就是说,数据库确实有查询优化引擎,他们将分析您的查询并确定检索数据的最佳计划,并了解如何join表(与您的scheme中不相关),以及可用的索引希望避免全表扫描,所以性能调优和查看查询计划是非常重要的,正如其他人已经指出的那样。

上面关于校验和的一点看起来很有趣,甚至可能是同一个表中attr1的索引。