我有一批数据需要被添加到一个MySQL数据库每天大约100K的查询。
START TRANSACTION; INSERT IGNORE INTO info (Created, Modified, MType, Pform, Name, Version, Sig) VALUES ('2013-07-31','2013-07-31','mtype','pform','name','version','signature'); (repeat 49,000 times) edit: SELECT id INTO @r FROM info WHERE sig = 'signature'; INSERT IGNORE INTO fullname (ID, Name) values (@r,'fullname'); (repeat 49,000 times) UPDATE info SET dbversion = 2098 WHERE dbversion = 0; UPDATE version SET ver = 2098; COMMIT;
我觉得这不是最有效的方法。 这个过程不会占用太多的CPU或内存,但是如果可能的话我希望能够更快地完成。 现在需要20分钟左右 有什么build议?
阅读LOAD DATA并查看它是否符合您的需求和限制。 其中,你告诉我们的唯一一个是“更快”,但也许你也有其他的担心:-)
http://dev.mysql.com/doc/refman/5.5/en/load-data.html
或者,它看起来像你可以做INSERT INTO VALUES (1a, 1b),..(50000a, 50000b)但可能会有一个最大的查询大小,你会遇到。
https://stackoverflow.com/questions/5529529/mysql-bulk-insert
看看你在问题中发布的查询,我会假设你的表使用InnoDB。
虽然你接受的答案很好,但我想要添加别的东西。

请注意双写缓冲区。 更改通常通过日志缓冲区写入ibdata1的双写缓冲区和日志文件(ib_logfile0,ib_logfile1)。
您可以禁用双写缓冲区,但它需要重新启动MySQL两次。
步骤01 : SET GLOBAL innodb_fast_shutdown = 0;
service mysql restart --innodb_doublewrite='OFF' --innodb_fast_shutdown=0 : service mysql restart --innodb_doublewrite='OFF' --innodb_fast_shutdown=0
步骤03 :执行你的代码
START TRANSACTION; INSERT IGNORE INTO info (Created, Modified, MType, Pform, Name, Version, Sig) VALUES ('2013-07-31','2013-07-31','mtype','pform','name','version','signature'); (repeat 49,000 times) edit: SELECT id INTO @r FROM info WHERE sig = 'signature'; INSERT IGNORE INTO fullname (ID, Name) values (@r,'fullname'); (repeat 49,000 times) UPDATE info SET dbversion = 2098 WHERE dbversion = 0; UPDATE version SET ver = 2098; COMMIT;
STEP 04 : service mysql restart
在执行批量更新时,您的查询应该具有较less的磁盘I / O。
试一试 !!!
CAVEAT :将innodb_fast_shutdown设置为0将强制将ibdata1,ib_logfile0和ib_logfile1中的所有事务性更改完全刷新到磁盘。 这使得mysql启动时间更短。