Я разрабатываю программу на 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, и похоже, что он ничего не должен делать.