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

Ответ 3

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