В моем приложении мои 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 миллилитров, чтобы получить данные из таблицы.
Есть что-то, чего мне не хватает? Как сделать вставки быстрее?
Ответы:
Рассмотрим пакет ваших коммитов. Размер партии 1024 - это хороший начальный размер. Изменяйте размеры партии, пока не достигнете оптимальной производительности.
источник
Проверяли ли вы или можно было бы отбросить индексы в таблицах (таблицах) назначения, в которые вы вставляете, вставить их в меньшие порции (оптимально, как указано выше), а затем перестроить индексы в таблицах назначения после того, как все вставки завершены? Может быть что-то достаточно легко проверить, чтобы подтвердить.
источник
Некоторые советы по массовой загрузке данных из документа MySQL могут быть полезными. https://dev.mysql.com/doc/refman/5.6/en/optimizing-innodb-bulk-data-loading.html
Вы можете увеличить скорость вставки несколькими способами:
Надеюсь, это поможет!
источник