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

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

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

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

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

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
8
0
1 000
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

  1. Переместите файлы туда и подключитесь через сокет unix
  2. Создайте вместо INSERTS файл ЗАГРУЗИТЬ ДАННЫЕ В ФАЙЛ
  3. Отключение индексов во время загрузки
Ответ принят как подходящий
  • Используйте инструмент mysqlimport или команду ЗАГРУЗИТЬ ДАННЫЕ INFILE.
  • Временно отключите индексы, которые вам не нужны для целостности данных

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

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

Сделки устраняют

ВСТАВИТЬ, СИНХРОНИЗАЦИЯ К ДИСКУ

фаза повторения, и вместо этого весь дисковый ввод-вывод выполняется, когда вы ЗАКЛЮЧАЕТ транзакцию.

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

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

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

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

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

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

dkretz 24.11.2008 19:39

Вы серьезно думаете, что это быстрее, чем ЗАГРУЗИТЬ ДАННЫЕ?

dkretz 24.11.2008 19:40

хех, вероятно, нет, но если ЗАГРУЗИТЬ ДАННЫЕ не было вариантом, остальное имеет смысл.

Kent Fredric 24.11.2008 19:49

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

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

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

Обычно лучше всего начинать с пустой таблицы.

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

Другие вопросы по теме