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


10

У моїй заяві мої ВСТАВКИ, здається, займають велику частину часу. У мене є велика кількість об'єктів в пам'яті (~ 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 стовпців, більшість з яких - числа, з парою варчарів (60) та 1 текстовим стовпцем. Версія Mysql 5.5. Працює в INNODB і має 1 індекс для первинних ключів Integer. Усі запити виконуються в операції.

Я будую свої запити з Java та використовую Spring JDBC для запуску запитів.

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

Для того, щоб зберігати речі в перспективі, для отримання даних із таблиці потрібно 100-200 мільйонів.

Щось мені не вистачає? Як зробити вставки швидше?


Питання, пов'язані з переповненням стека: MySQL та JDBC з rewriteBatchedStatements = true
Gord Thompson

Відповіді:


3

Подумайте про те, як скласти свої комісії. Розмір партії 1024 - хороший стартовий розмір. Змінюйте розміри партії, поки не досягнете оптимальної пропускної здатності.


1

Ви протестували чи чи можна було б скинути індекси на таблицю (и) БД призначення, куди ви вставляєте, вставити їх у менші партії (оптимально, як зазначено вище), а потім відновити індекси в таблиці призначення (таблиць) як тільки всі вставки завершені? Тест може бути досить легким для перевірки.


0

Можливо корисні деякі поради щодо завантаження даних із документа mysql. https://dev.mysql.com/doc/refman/5.6/uk/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.