У меня есть пакет данных, который нужно добавлять в базу данных mysql каждый день, состоящий из около 100 тысяч запросов.
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;
Мне кажется, что это не самый эффективный способ сделать это. Процесс не использует много процессора или памяти, но я бы хотел, чтобы он завершился быстрее, если это возможно. Сейчас это занимает ~ 20 минут. Любой совет?
Следить за публикациями 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;
ШАГ 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
Ваш запрос должен иметь меньше операций ввода-вывода на диск при выполнении массового обновления.
Попробуйте !!!
ПРЕДОСТЕРЕЖЕНИЕ : Настройка innodb_fast_shutdown значение 0 заставляет все транзакционные изменения в ibdata1, ib_logfile0 и ib_logfile1 полностью сбрасываться на диск. Это сокращает время запуска mysql.