Назад | Перейти на главную страницу

Каков наиболее эффективный способ добавить много данных в базу данных mysql?

У меня есть пакет данных, который нужно добавлять в базу данных 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.

Хотя вы приняли отличный ответ, я хотел добавить еще кое-что.

Архитектура 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.