Я разрабатываю программу на Python, которая обращается к базе данных MySQL с помощью MySQLdb. В определенных ситуациях мне приходится запускать команду INSERT или REPLACE для многих строк. Сейчас я делаю это так:
db.execute("REPLACE INTO " + table + " (" + ",".join(cols) + ") VALUES" +
",".join(["(" + ",".join(["%s"] * len(cols)) + ")"] * len(data)),
[row[col] for row in data for col in cols])
Он работает нормально, но немного неудобно. Мне было интересно, могу ли я упростить чтение, и я узнал о команде executemany. Я изменил свой код, чтобы он выглядел так:
db.executemany("REPLACE INTO " + table + " (" + ",".join(cols) + ") " +
"VALUES(" + ",".join(["%s"] * len(cols)) + ")",
[tuple(row[col] for col in cols) for row in data])
Он все еще работал, но он работал намного медленнее. В моих тестах для относительно небольших наборов данных (около 100-200 строк) он работал примерно в 6 раз медленнее. Для больших наборов данных (около 13 000 строк, самый большой, который я ожидаю обработать) он работал примерно в 50 раз медленнее. Почему он это делает?
Мне бы очень хотелось упростить свой код, но я не хочу большого падения производительности. Кто-нибудь знает, как сделать это быстрее?
Я использую Python 2.7 и MySQLdb 1.2.3. Я попытался повозиться с функцией setinputsizes, но она, похоже, ничего не дала. Я посмотрел исходный код MySQLdb, и похоже, что он ничего не должен делать.