我有一批数据需要每天添加到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 分钟。有什么建议吗?
答案1
阅读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
答案2
查看您在问题中发布的查询,我假设您的表使用 InnoDB。
虽然您接受的答案很棒,但我想添加其他内容。
InnoDB架构
请注意双写缓冲区。更改通常通过日志缓冲区写入 ibdata1 中的双写缓冲区和日志文件 (ib_logfile0、ib_logfile1)。
您可以禁用双写缓冲区,但这需要重新启动 mysql 两次。
步骤 01:SET GLOBAL innodb_fast_shutdown = 0;
步骤 02: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;
步骤 04:service mysql restart
进行批量更新时,您的查询应该具有较少的磁盘 I/O。
试一试 !!!
警告: 环境innodb_fast_shutdown设置为 0 会强制将 ibdata1、ib_logfile0 和 ib_logfile1 中的所有事务更改完全刷新到磁盘。这可以缩短 mysql 的启动时间。