如何提高十亿行表的插入性能?

时间:2014-01-13 13:00:25

标签: php mysql database performance

我有十亿行表不再适合内存。

当我批量插入新行时,重新计算主索引的开销会导致性能下降。我必须有这个索引,因为否则SELECT语句真的很慢。但由于插入按随机顺序排列,每插入一行,数据必须写入磁盘的不同区域。

由于硬盘的上限为每秒200次IO操作,因此这会减慢插入速度。

在这种情况下,我可以同时“吃蛋糕并吃掉它”吗?也许通过创建另一个表,其中数据将按不同的列分组(通过使用不同的主键)?但这对我来说似乎很浪费,我甚至不知道这是否会有所帮助......

或许我可以使用一些临时表?插入1,000,000行,然后将它们插入目标表,按主键分组?

我注定了吗?

编辑:

我已经水平分区了桌子。

当我删除我需要的这个字段上的主键并将其放在自动增量字段上时,插入速度非常快。

不幸的是,由于磁盘上的数据是由主键值放置的,这会导致选择性能...因为选择不基于自动增量值而是基于PK值进行查询。

所以要么我快速插入行,要么我快速选择它们。在这两种情况下都没有任何解决方案可以帮助吗?

2 个答案:

答案 0 :(得分:0)

。每次插入数据后都会插入新行时插入新行。这需要更多时间。 你可以使用

START TRANSACTION

...你插入查询...

COMMIT

答案 1 :(得分:0)

尝试这样

mysql_query(“START TRANSACTION”);

您的插入查询

的mysql_query( “COMMIT”);