повышение производительности загрузки данных MySQL Infile - PullRequest
10 голосов
/ 09 января 2012

Я пытаюсь выполнить массовую загрузку около 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-метровых записей?

Ответы [ 2 ]

7 голосов
/ 09 января 2012

Если вы знаете, данные «чистые», то вы можете удалить индексы на затронутых таблицах до импорта, а затем повторно добавить их после завершения.

В противном случае каждая запись вызывает пересчет индекса, и, если у вас есть несколько индексов, это может ДЕЙСТВИТЕЛЬНО замедлить процесс.

2 голосов
/ 09 января 2012

Всегда трудно сказать, что является причиной проблем с производительностью, но это мои 2 цента: Ваш ключ, являющийся uuid, распределяется случайным образом, что затрудняет поддержание индекса. Причина в том, что ключи хранятся по диапазону в блоке файловой системы, поэтому случайные uuids следуют друг за другом, заставляя ОС читать и записывать блоки в файловую систему без использования кеша. Я не знаю, можете ли вы изменить ключ, но вы можете отсортировать uuids во входном файле и посмотреть, поможет ли это. К вашему сведению, чтобы лучше понять эту проблему, я бы взглянул на это сообщение в блоге и, возможно, прочитал бы эту книгу mysql высокая производительность , там есть хорошая глава о кластерном индексе innodb. Удачи!

...