Каков наилучший способ добиться быстрой вставки больших объемов данных в MySQL? - PullRequest
8 голосов
/ 24 ноября 2008

Я написал программу на C для синтаксического анализа больших файлов XML, а затем создания файлов с операторами вставки. Какой-то другой процесс может загружать файлы в базу данных MySQL. Эти данные будут служить в качестве службы индексации, чтобы пользователи могли легко находить документы.

Я выбрал InnoDB для возможности блокировки на уровне строк. Программа на C будет генерировать в любом месте от 500 до 5 миллионов операторов вставки при данном вызове.

Каков наилучший способ как можно быстрее поместить все эти данные в базу данных? Следует также отметить, что БД находится на отдельном сервере. Стоит ли переносить файлы на этот сервер, чтобы ускорить вставку?

РЕДАКТИРОВАТЬ: Эта таблица на самом деле не будет обновляться, но строки будут удалены.

Ответы [ 6 ]

15 голосов
/ 24 ноября 2008
  • Используйте инструмент mysqlimport или команду LOAD DATA INFILE.
  • Временно отключить индексы, которые вам не нужны для целостности данных
2 голосов
/ 24 ноября 2008

Я бы сделал по крайней мере эти вещи в соответствии с этой ссылкой :

  1. Переместите туда файлы и подключитесь через сокет Unix
  2. Генерация вместо ВСТАВКИ ЗАГРУЗКА ДАННЫХ INFILE файл
  3. Отключение индексов при загрузке
1 голос
/ 24 ноября 2008

Действительно зависит от двигателя. Если вы используете InnoDB, используйте транзакции (вы не можете их избежать - но если вы используете автокоммит, каждый пакет неявно находится в своем собственном txn), но убедитесь, что они не слишком большие или слишком маленькие.

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

Если вы начинаете с пустой таблицы, это обычно лучше.

LOAD DATA - победитель в любом случае.

1 голос
/ 24 ноября 2008

Если вы не можете использовать LOAD DATA INFILE, как предлагали другие, используйте подготовленные запросы для вставок.

1 голос
/ 24 ноября 2008

1. Убедитесь, что вы используете транзакцию.

Транзакции исключают

ВСТАВИТЬ, СИНХРОНИЗИРОВАТЬ

фаза повторения, и вместо этого весь дисковый ввод-вывод выполняется при выполнении транзакции.

2. Убедитесь, что используется сжатие соединения

Необработанный текст + сжатый поток GZip ~ = в некоторых случаях до 90% экономии полосы.

3. По возможности используйте обозначение параллельной вставки

INSERT INTO TableName(Col1,Col2) VALUES (1,1),(1,2),(1,3) 

(меньше текста для отправки, более короткое действие)

1 голос
/ 24 ноября 2008

MySQL со стандартными форматами таблиц работает удивительно быстро, если это таблица только для записи; поэтому первый вопрос - собираетесь ли вы обновлять или удалять. Если нет, не используйте innosys - блокировка не нужна, если вы просто добавляете. Вы можете периодически обрезать или переименовывать выходной файл, чтобы иметь дело с размером таблицы.

...