2010-03-17 2 views
21

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

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

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

Большое спасибо DBA

+0

Насколько велики записи? – Grumpy

+0

от 60 до 100 байт, от 5 до 8 полей. Ничего действительно большого, это огромное количество, которое заставляет все это замедляться. – DBa

ответ

38

, если вы используете 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 на более мелкие куски

типичной статистика импорта I наблюдались при объемных нагрузках:

3.5 - 6.5 million rows imported per min 
210 - 400 million rows per hour 
+0

Отключение unique_checks уже улучшило производительность, а также сортировку по первичному ключу. Спасибо! – DBa

1

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

Смежные вопросы