Каков наилучший способ добиться быстрых вставок больших объемов данных в MySQL?

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

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

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

EDIT: эта таблица на самом деле не будет обновляться, но строки будут удалены.

6 ответов


  • используйте инструмент mysqlimport или команду LOAD DATA INFILE.
  • временно отключите индексы, которые вам не нужны для целостности данных

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

  1. переместите файлы туда и подключитесь через сокет unix
  2. генерировать вместо вставок a ЗАГРУЗИТЬ ДАННЫЕ INFILE
  3. отключение индексов во время загрузки

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


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

операции устранить

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

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

2. Обязательно используйте сжатие соединения

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

3. Использовать параллельную вставку, где возможно

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

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


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


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

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

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

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