Я загружаю файл объемом 100 ГБ через LOAD DATA INFILE. У меня был хороший успех с MyISAM, несколько часов и все готово.
Я пытаюсь это сейчас, используя InnoDB. Загрузка начинается быстро со скоростью более 10 МБ / с (наблюдение за ростом файла таблицы file_per_table
включено).
Но после примерно 5 ГБ данных он замедляется до диапазона 2-4 МБ / с, а когда я получаю более 20 ГБ, он снижается примерно до 2 МБ / с.
Размер буферных пулов InnoDB составляет 8G. И перед выполнением команды LOAD DATA INFILE я сделал следующее:
SET @@session.sql_log_bin=0;
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
alter table item_load disable keys;
//Run LOAD DATA INFILE....
Я не вижу причины, по которой все начинается хорошо и со временем замедляется.
Кроме того, используя те же настройки, я выполнил ту же команду LOAD DATA INFILE с таблицей, используя InnoDB и MyISAM и набор тестовых данных 5 ГБ, MyISAM был в 20 раз быстрее:
InnoDB:
mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (21 min 25.38 sec)
Records: 2630886 Deleted: 0 Skipped: 0 Warnings: 6
MyISAM:
mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (1 min 2.52 sec)
Records: 2630886 Deleted: 0 Skipped: 0 Warnings: 6
Что-нибудь еще, я должен рассмотреть попытку? Движок MyISAM способен намного лучше поддерживать скорость загрузки.
Дополнительные детали:
Я пытался загрузить файлы по отдельности, без разницы.
Кстати, у меня 150 файлов по 500 МБ каждый, в каждом файле ключи сортируются.
После получения 40 ГБ за ночь, 12 часов спустя, скорость загрузки снизилась до 0,5 МБ / с, что означает, что операция практически невозможна.
Других ответов на подобные вопросы на других форумах я не нашел, мне кажется, что InnoDB не поддерживает загрузку больших объемов данных в таблицы размером более нескольких ГБ.
источник
Окончательный ответ на этот вопрос состоял в том, чтобы не использовать InnoDB для массивной справочной таблицы. MyISAM кричит быстро, почти полная пропускная способность диска для всей нагрузки, InnoDB не работает. MyISAM прост, но в этом случае так же требования этой таблицы. Для простой справочной таблицы с объемными нагрузками через LOAD DATA INFILE MyISAM - это путь, который пока хорош.
Но обратите внимание, что если вы запустите таблицы MyISAM и InnoDB, то вам нужно будет рассмотреть вопрос о распределении памяти для двух механизмов кэширования, каждый механизм имеет свое уникальное кэширование, которое требует отдельного выделения памяти.
источник
Вы можете попытаться разбить ваши входные файлы на более мелкие куски.
Я лично использую http://www.percona.com/doc/percona-toolkit/2.1/pt-fifo-split.html для этого.
Что произойдет, если вы получите блокировку таблицы для таблицы во время импорта? Возможно, блокировка на уровне строк InnoDB замедляет его (MyISAM использует блокировку таблицы).
Вы также можете прочитать здесь для дальнейших идей: http://derwiki.tumblr.com/post/24490758395/loading-half-a-billion-rows-into-mysql
источник
Если ваш PK не AUTO_INCREMENT или данные в csv-файле не отсортированы на PK, это может повлиять на производительность загрузки данных. Так как таблица в MySQL является индексом, следовательно, все данные хранятся в отсортированном порядке, если значение PK не находится в AUTO_INCREMENT, то MySQL должен выполнить большое смещение данных, чтобы получить данные, сохраненные в отсортированном порядке. Это является причиной более медленной загрузки данных, когда размер таблицы начинает расти.
Я загружаю csv-файл 91 ГБ с PK на AUTO_INCREMENT, используя LOAD DATA INFILE, и я не вижу никакого падения в моей пропускной способности. Я получаю от 140К до 145К вставок в секунду. Использование Percona MySQL 5.6.38
источник