Я вставляю несколько миллионов строк в таблицу MySql. Я использую подготовленный оператор, как показано ниже.
Ожидается ли, что создание одной строки вставки, подобной приведенной ниже, будет значительно быстрее?
Подход с одной строкой из Is 22 секунды — хорошее время для вставки 500 строк в mysql? :
INSERT INTO example
(example_id, name, value, other_value)
VALUES
(100, 'Name 1', 'Value 1', 'Other 1'),
(101, 'Name 2', 'Value 2', 'Other 2'),
(102, 'Name 3', 'Value 3', 'Other 3'),
(103, 'Name 4', 'Value 4', 'Other 4');
Чем я сейчас занимаюсь:
//
// method to do upload
//
public static void doUpload(Connection conn) {
log.info("Deleting existing data...");
Database.update("truncate table attribute", conn);
log.info("Doing inserts");
String sqlString = "insert into attribute values (null,?,?,?)";
int max = 1000000;
PreparedStatement ps = Database.getPreparedStatement(sqlString, conn);
for (int i = 0; i < max; i++) {
// add params
String subjectId = i+"";
addParam(subjectId, "GENDER", getGender(), ps);
addParam(subjectId, "AGE", getAge(), ps);
addParam(subjectId, "CITY", getCity(), ps);
addParam(subjectId, "FAVORITE_COLOR", getColor(), ps);
addParam(subjectId, "PET", getPet(), ps);
if (i % 1000 == 0) {
log.info("Executing " + i + " of " + max);
Database.execute(ps);
log.info("Done with batch update");
ps = Database.getPreparedStatement(sqlString, conn);
}
}
if (Database.isClosed(ps) == false) {
Database.execute(ps);
}
}
//
// method to add param to the prepared statement
//
private static void addParam(String subjectId, String name, String val, PreparedStatement ps) {
ArrayList<String> params;
params = new ArrayList<String>();
params.add(subjectId + "");
params.add(name);
params.add(val);
Database.addToBatch(params, ps);
}
//
// addToBatch
//
public static void addToBatch(List<String> params, PreparedStatement ps) {
try {
for (int i = 0; i < params.size(); i++) {
ps.setString((i + 1), params.get(i));
}
ps.addBatch();
} catch (Exception exp) {
throw new RuntimeException(exp);
}
}
Каков самый быстрый способ сделать этот тип вставки?
В настоящее время я вставляю 1000 строк примерно за 5 секунд. Разумно ли ожидать гораздо большего, чем это? Я работаю локально и уже удалил все индексы в таблице, в которую вставляю.
executeBatch()
и повторное использование файлаPreparedStatement
. Это, безусловно, быстрее, чем самостоятельно создавать строки SQL, и более экономично в отношении памяти. - person user207421   schedule 16.08.2020