我有十亿行表不再适合内存。
当我批量插入新行时,重新计算主索引的开销会导致性能下降。我必须有这个索引,因为否则SELECT语句真的很慢。但由于插入按随机顺序排列,每插入一行,数据必须写入磁盘的不同区域。
由于硬盘的上限为每秒200次IO操作,因此这会减慢插入速度。
在这种情况下,我可以同时“吃蛋糕并吃掉它”吗?也许通过创建另一个表,其中数据将按不同的列分组(通过使用不同的主键)?但这对我来说似乎很浪费,我甚至不知道这是否会有所帮助......
或许我可以使用一些临时表?插入1,000,000行,然后将它们插入目标表,按主键分组?
我注定了吗?
编辑:
我已经水平分区了桌子。
当我删除我需要的这个字段上的主键并将其放在自动增量字段上时,插入速度非常快。
不幸的是,由于磁盘上的数据是由主键值放置的,这会导致选择性能...因为选择不基于自动增量值而是基于PK值进行查询。
所以要么我快速插入行,要么我快速选择它们。在这两种情况下都没有任何解决方案可以帮助吗?
答案 0 :(得分:0)
。每次插入数据后都会插入新行时插入新行。这需要更多时间。 你可以使用
START TRANSACTION
...你插入查询...
COMMIT
答案 1 :(得分:0)
尝试这样
mysql_query(“START TRANSACTION”);
您的插入查询
的mysql_query( “COMMIT”);