MySQL загружает данные infile - ускорение?
иногда мне приходится повторно импортировать данные для проекта, таким образом, считывая около 3,6 миллиона строк в таблицу MySQL (в настоящее время InnoDB, но на самом деле я не ограничен этим движком). "Load data infile..." оказалось самым быстрым решением, однако оно имеет компромисс:
- при импорте без ключей сам импорт занимает около 45 секунд, но создание ключа занимает много времени (уже работает 20 минут...).
- выполнение импорта с помощью ключей на таблице делает импорт намного медленнее
Есть ключи по 3 полям таблицы, ссылающиеся на числовые поля.
Есть ли способ ускорить это?
Другая проблема: когда я завершаю процесс, который начал медленный запрос, он продолжает работать в базе данных. Есть ли способ завершить запрос без перезагрузки mysqld?
Большое спасибо
ДБА
Ответы
Ответ 1
если вы используете innodb и массовую загрузку, вот несколько советов:
сортируйте свой файл csv в порядке первичного ключа целевой таблицы: помните, как использует innodb
кластерные первичные ключи, поэтому он будет загружаться быстрее, если он будет отсортирован!
типичная информация о загружаемых данных я используется:
truncate <table>;
set autocommit = 0;
load data infile <path> into table <table>...
commit;
другие оптимизации, которые вы можете использовать для увеличения времени загрузки:
set unique_checks = 0;
set foreign_key_checks = 0;
set sql_log_bin=0;
разделите файл csv на более мелкие куски
типичная статистика импорта, которую я наблюдал при насыпных нагрузках:
3.5 - 6.5 million rows imported per min
210 - 400 million rows per hour
Ответ 2
Это сообщение в блоге почти 3 года, но оно по-прежнему актуально и содержит некоторые полезные рекомендации для оптимизации производительности "LOAD DATA INFILE":
http://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/
Ответ 3
InnoDB - неплохой двигатель. Однако он очень полагается на "настройку". Одно дело, что если ваши вставки не находятся в порядке увеличения первичных ключей, innoDB может занять немного больше времени, чем MyISAM. Это можно легко преодолеть, установив более высокий файл innodb_buffer_pool_size. Мое предложение состоит в том, чтобы установить его на 60-70% от вашей общей ОЗУ на специализированной машине MySQL.