#java #mysql
#java #mysql
Вопрос:
Какой из них даст мне лучшую производительность?
- Использовать Java просто зациклить значение и добавить к строке sql и выполнить инструкцию сразу? Обратите внимание, что также используется PreparedStatement.
INSERT INTO tbl ( c1 , c2 , c3 )
VALUES ('r1c1', 'r1c2', 'r1c3'),
('r2c1', 'r2c2', 'r2c3'),
('r3c1', 'r3c2', 'r3c3') - Используйте пакетное выполнение, как показано ниже.
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. Попытаюсь протестировать и посмотреть. Спасибо.