Эффективная множественная вставка SQL - PullRequest
5 голосов
/ 08 августа 2010

Каков наилучший / наиболее эффективный по времени способ вставить 1000 строк в одну таблицу (база данных jdbc / connector-mysql)? (это буфер и его нужно сбрасывать в базу данных каждый раз, когда он заполнен)

1 - Один автоматически сгенерированный / объединенный оператор SQL?

2- for (int i = 0; i<1000; i++) { con.prepareStatement(s.get(i)); } con.commit();

3 - хранимая процедура?

4 - массовая вставка данных через файл?

5- (ваше решение)

Ответы [ 3 ]

2 голосов
/ 08 августа 2010

Оператор LOAD DATA INFILE , вероятно, является лучшим выбором для повышения производительности.(# 4 из вашего списка вариантов выше) Хотя, вероятно, потребуется больше кода для выполнения вашей задачи, поскольку вам нужно создать промежуточный файл, передать его на сервер и затем вызвать LOAD DATA, чтобы получить его в вашей базе данных.

Страницы справки MySql цитата:

Оператор LOAD DATA INFILE считывает строки из текстового файла в таблицу с очень высокой скоростью.

0 голосов
/ 08 августа 2010

Обратите внимание, что JDBC выполняет автоматическую фиксацию после каждого оператора, если вы явно не указали этого. Это и запуск X-вставок перед выполнением коммита должны немного улучшить вашу производительность.

0 голосов
/ 08 августа 2010

Вы можете использовать пакетные вставки JDBC.

PreparedStatement ps = cn.prepareStatement("INSERT INTO....");

for (int i = 0; i < 1000; i++) {
    ps.setString(1, "value-" + i); // Set values
    ps.addBatch();                 // Add this to the batch
    ps.clearParameters();          // Reset the parameters
}

ps.executeBatch();

Однако MySQL изначально не поддерживает функцию пакетной вставки, поэтому для достижения разумной производительности вам необходимо добавить rewriteBatchedStatements=true в конфигурацию mysql jdbc.

Существует также специальный синтаксис пакетной вставки MySQL, который можно использовать, если вы хотите создать большую строку SQL.Я бы попробовал оба и проверил производительность.

INSERT INTO x (a,b)
     VALUES ('1', 'one'),
            ('2', 'two'),
            ('3', 'three');

Будьте осторожны с обоими подходами, так как вы можете превысить максимальный размер пакета для одного запроса.Вам может потребоваться установить размер пакета, который отличается от количества записей в буфере.Например, вам может понадобиться разделить 1000 записей на 10 пакетов по 100.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...