Вставка нескольких строк с использованием одного оператора против пакетной вставки в mysql

#java #mysql

#java #mysql

Вопрос:

Какой из них даст мне лучшую производительность?

  1. Использовать Java просто зациклить значение и добавить к строке sql и выполнить инструкцию сразу? Обратите внимание, что также используется PreparedStatement.

    INSERT INTO tbl ( c1 , c2 , c3 )
    VALUES ('r1c1', 'r1c2', 'r1c3'),
    ('r2c1', 'r2c2', 'r2c3'),
    ('r3c1', 'r3c2', 'r3c3')

  2. Используйте пакетное выполнение, как показано ниже.

    String SQL_INSERT = "INSERT INTO tbl (c1, c2, c3) VALUES (?, ?, ?);";

     try (
            Connection connection = database.getConnection();
            PreparedStatement statement = connection.prepareStatement(SQL_INSERT);
        ) {
    
        int i = 0;
        for (Entity entity : entities) {
            statement.setString(1, entity.getSomeProperty());
            // ...
    
            statement.addBatch();
            i  ;
    
            if (i % 1000 == 0 || i == entities.size()) {
                statement.executeBatch(); // Execute every 1000 items.
            }
        }
    }
     

Комментарии:

1. Протестируйте и узнайте. Вам нужно будет найти оптимальный размер пакета. Слишком большой, и вы тратите время на подготовку. Слишком маленький, и вы выполняете слишком много запросов.

2. Да, я согласен с @tadman, вы должны проверить и выяснить это эмпирически для себя. Я скажу, что я думаю, что пакетные операторы были сделаны именно по этой причине.

3. Иногда производительность подготовленного оператора вызывает удивление. Они предназначены для повторного использования таким образом.

4. Я могу неправильно понять ваши ответы, ребята. Но я не говорю об оптимальном размере пакета для 2-го способа. Я думаю о том, использовали ли оба способа PreparedStatement для выполнения. Какой способ работает лучше? Предположим, что необходимо вставить от 10 до 60 тыс. строк

5. Также посмотрите, есть ли в java api «LOAD DATA LOCAL INFILE» для программного ввода данных, как если бы это был файл CSV.

Ответ №1:

Несколько лет назад я делал презентацию, которую я назвал Load Data Fast!. Я сравнил множество различных методов вставки данных как можно быстрее и провел их сравнительный анализ.

ЗАГРУЗКА ДАННЫХ в файл была намного быстрее, чем любым другим методом.

Но есть и другие факторы, которые влияют на скорость, такие как тип данных и тип оборудования, и, возможно, нагрузка на систему от других одновременных клиентов базы данных. Результаты, которые я получил, описывают только производительность Macbook Pro.

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

Это то, что значит быть инженером-программистом. Вы не всегда получаете ответы, которые вам дают с ложечки. Вы должны провести некоторое тестирование, чтобы подтвердить их.

Комментарии:

1. Попытаюсь протестировать и посмотреть. Спасибо.