InnoDB架构

InnoDB架构

我有一批数据需要每天添加到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架构

InnoDB架构

请注意双写缓冲区。更改通常通过日志缓冲区写入 ibdata1 中的双写缓冲区和日志文件 (ib_logfile0、ib_logfile1)。

您可以禁用双写缓冲区,但这需要重新启动 mysql 两次。

步骤 01SET GLOBAL innodb_fast_shutdown = 0;

步骤 02service 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;

步骤 04service mysql restart

进行批量更新时,您的查询应该具有较少的磁盘 I/O。

试一试 !!!

警告: 环境innodb_fast_shutdown设置为 0 会强制将 ibdata1、ib_logfile0 和 ib_logfile1 中的所有事务更改完全刷新到磁盘。这可以缩短 mysql 的启动时间。

相关内容