Вставьте Скорости для больших партий


10

В моем приложении мои INSERT, кажется, занимают большую часть времени. У меня есть большое количество объектов в памяти (~ 40-50 000), которые я хочу вставить в таблицу.

Давайте возьмем образец таблицы

CREATE TABLE bill (
id BIGINT(20) PRIMARY KEY,
amount INT(11) DEFAULT 0,
bill_date DATETIME DEFAULT NOW(),
INDEX (bill_date)
) ENGINE=InnoDB

Взяв 3 ряда в качестве размера пакета, я могу подумать о следующих подходах

Подход 1 - построить и запустить 3 необработанных вставки

INSERT INTO bill (amount, bill_date) VALUES (10, '2012-01-01 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (20, '2012-01-02 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (40, '2013-02-05 00:00:00');

Подход 2 - объединение значений в 1 запрос

INSERT INTO bill (amount, bill_date) VALUES 
(10, '2012-01-01 00:00:00'),
(20, '2012-01-02 00:00:00'),
(40, '2013-02-05 00:00:00');

Подход 3 - запустить этот запрос 1 раз, передав 6 параметров

INSERT INTO bill (amount, bill_date) VALUES 
(?, ?), (?, ?), (?, ?);

Подход 4 - запустить этот подготовленный запрос 3 раза, каждый раз меняя 2 параметра

INSERT INTO bill (amount, bill_date) VALUES (?, ?);

Любые другие подходы приветствуются.

Мой вопрос

Какой самый быстрый способ сделать несколько вставок в таблице?

Я прочитал эту ссылку на скорость вставки MySQL и это руководство по программированию JDBC , но я не могу прийти к выводу.

Мое дело -

В настоящее время моя таблица имеет ~ 20 столбцов, большинство из которых являются числами, с парой varchar (60) и 1 текстовым столбцом. Mysql версия 5.5. Работает на INNODB и имеет 1 индекс на первичных ключах Integer. Все запросы выполняются в транзакции.

Я строю свои запросы из Java и использую Spring JDBC для выполнения запросов.

В настоящее время я придерживаюсь подхода 3. Требуется около 10 секунд для 20 000 вставок в пустую таблицу, не считая времени, необходимого для создания запроса.

Чтобы держать вещи в перспективе, требуется 100-200 миллилитров, чтобы получить данные из таблицы.

Есть что-то, чего мне не хватает? Как сделать вставки быстрее?


Связанный вопрос о переполнении стека: MySQL и JDBC с rewriteBatchedStatements = true
Горд Томпсон

Ответы:


3

Рассмотрим пакет ваших коммитов. Размер партии 1024 - это хороший начальный размер. Изменяйте размеры партии, пока не достигнете оптимальной производительности.


1

Проверяли ли вы или можно было бы отбросить индексы в таблицах (таблицах) назначения, в которые вы вставляете, вставить их в меньшие порции (оптимально, как указано выше), а затем перестроить индексы в таблицах назначения после того, как все вставки завершены? Может быть что-то достаточно легко проверить, чтобы подтвердить.


0

Некоторые советы по массовой загрузке данных из документа MySQL могут быть полезными. https://dev.mysql.com/doc/refman/5.6/en/optimizing-innodb-bulk-data-loading.html

Вы можете увеличить скорость вставки несколькими способами:

- turn off autocommit
- turn off unique check
- turn off foreign check

Надеюсь, это поможет!


2
Если вы отключите проверку ограничений (уникальный, внешний ключ, ...), убедитесь, что ваши данные не нарушают их или ваша база данных находится в несовместимом состоянии с этого момента.
Дэвид Спиллетт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.