Улучшение производительности данных mysql load infile
Я пытаюсь нагрузить нагрузку около 12 м записей в таблицу InnoDB в (локальном) mysql, используя LOAD DATA INFILE (из CSV) и обнаружив, что он занимает очень много времени.
Основной тип ключа - UUID, а ключи не сортируются в файлах данных.
Я разделил файл данных на файлы, содержащие 100000 записей, и импортировал их как:
mysql -e 'ALTER TABLE customer DISABLE KEYS;'
for file in *.csv
mysql -e "SET sql_log_bin=0;SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0;
SET AUTOCOMMIT=0;LOAD DATA INFILE '${file}' INTO TABLE table
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; COMMIT"
Это отлично работает для первых нескольких сотен тысяч записей, но тогда время вставки для каждой последующей загрузки, похоже, продолжает расти (от 7 секунд до 2 минут на загрузку, прежде чем я его уничтожил.)
Я запускаю машину с 8 ГБ оперативной памяти и задал параметры InnoDB:
innodb_buffer_pool_size =1024M
innodb_additional_mem_pool_size =512M
innodb_log_file_size = 256M
innodb_log_buffer_size = 256M
Я также попытался загрузить один CSV, содержащий все строки, без везения - это заработало более 2 часов, прежде чем я его убил.
Есть ли что-то еще, что могло бы ускорить это, поскольку это кажется чрезмерным временем, чтобы загружать только записи на 12 м?
Ответы
Ответ 1
Всегда сложно сказать, в чем причина проблем с производительностью, но это мои 2 цента:
Ваш ключ, являющийся uuid, распределяется случайным образом, что затрудняет поддержание индекса. Причина в том, что ключи хранятся по диапазону в блоке файловой системы, поэтому случайные uuids следуют друг за другом, заставляя ОС читать и записывать блоки в файловую систему без использования кеша. Я не знаю, можете ли вы изменить ключ, но вы могли бы отсортировать uuids во входном файле и посмотреть, поможет ли это.
FYI, чтобы лучше понять эту проблему, я бы посмотрел на этот сообщение в блоге и, возможно, прочитал эту книгу высокая производительность mysql, в ней есть хорошая глава о индексировании кластеризованных индексов.
Удачи!
Ответ 2
Если вы знаете, что данные "чистые", вы можете отбросить индексы в затронутых таблицах перед импортом, а затем снова добавить их после завершения.
В противном случае каждая запись вызывает индекс-recalc, и если у вас есть куча индексов, это может ДЕЙСТВИТЕЛЬНО замедлить работу.