MySQL загружает данные infile - ускорение? - PullRequest
27 голосов
/ 17 марта 2010

иногда мне приходится повторно импортировать данные для проекта, таким образом считывая около 3,6 миллионов строк в таблицу MySQL (в настоящее время InnoDB, но на самом деле я не ограничен этим механизмом). «Load data infile ...» оказалось самым быстрым решением, однако оно имеет компромисс: - при импорте без ключей сам импорт занимает около 45 секунд, но создание ключа занимает много времени (уже работает в течение 20 минут ...). - выполнение импорта с ключами на столе значительно замедляет импорт

Есть ключи над 3 полями таблицы, ссылающиеся на числовые поля. Есть ли способ ускорить это?

Другая проблема: когда я завершаю процесс, который запустил медленный запрос, он продолжает выполняться в базе данных. Есть ли способ завершить запрос без перезапуска mysqld?

Большое спасибо ДБА

Ответы [ 3 ]

45 голосов
/ 24 марта 2010

, если вы используете 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
7 голосов
/ 17 марта 2010

Этому сообщению в блоге уже почти 3 года, но оно все еще актуально и содержит несколько полезных советов по оптимизации производительности "LOAD DATA INFILE":

http://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/

1 голос
/ 13 марта 2013

InnoDB - довольно хороший движок. Тем не менее, он очень полагается на «настроение». Одна вещь состоит в том, что если ваши вставки не в порядке увеличения первичных ключей, innoDB может занять немного больше времени, чем MyISAM. Это можно легко преодолеть, установив более высокое значение innodb_buffer_pool_size. Я предлагаю установить 60-70% от общего объема ОЗУ на выделенной машине MySQL.

...