У моїй заяві мої ВСТАВКИ, здається, займають велику частину часу. У мене є велика кількість об'єктів в пам'яті (~ 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 мільйонів.
Щось мені не вистачає? Як зробити вставки швидше?