2014-01-13 28 views
1

我有不能再适合内存的亿行表。如何提高十亿行表上的插入性能?

当我插入散装新行,讲述主索引的开销,杀死的性能。我必须拥有这个索引,否则SELECT语句真的很慢。但是由于插入是随机的,每插入一行,数据就必须写入磁盘的不同区域。

而且,由于HDD以每秒200个IO操作封端的,这减慢了向插入一个抓取。

我可以“有我的鱼和熊掌兼得”在这种情况下,同一时间?也许通过创建另一个表,其中数据按不同的列分组(通过具有不同的主键)?但这似乎浪费了我,我甚至不知道这是否会帮助......

或者,也许我可以利用一些临时表?在那里插入1,000,000行,然后将它们插入目标表,由主键分组?

我注定了吗?

编辑:

我已经水平分区表。

当我除去此字段我需要的主键,把它放在自动增量字段中,插入件是极快的。

不幸的是,因为磁盘上的数据通过主键值放置,这杀死了选择性能......因为选择不查询基础上,自动增量值,而是在PK值。

因此,无论我快速插入行还是快速选择它们。这两种情况下都没有解决方案吗?

+1

你真的使用1b记录的整个表吗?如果没有 - 然后使用[horizo​​ntal partitioning](http://en.wikipedia.org/wiki/Partition_%28database%29)并将你的表分成几部分。这取决于你的DBMS(你已经标记了其中的两个) –

+0

你怎么知道'重新计算主索引的开销,杀死了性能'?分区听起来很不错。 –

+2

您使用的是SQL Server还是MySQL?请适当地标记问题。 –

回答

0

。每次插入新行时,都会在插入数据后执行索引。这需要更多时间。 您可以使用

START TRANSACTION

...你r将查询......

COMMIT

+0

我用它插入50,000-70,000行每笔交易,它仍然没有多大帮助...我可以适合的行数的上限是多少?也许数量越大,mysql优化器可以更好地管理磁盘IO,因为更多的行可以由PK的分组? – user3010273

0

尝试像这样

的mysql_query( “开始交易”);

您的插入查询

mysql_query(“COMMIT”);