私のMySQLのテーブルのスキーマは次のとおりです。なぜ 'executemany'は 'IN'クエリを実行するのと比べて遅いのですか?
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE test_table (
id INT AUTO_INCREMENT,
last_modified DATETIME NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
私は、以下のベンチマークスクリプトを実行すると、私が手:
B1:20.5559301376
B2:0.504406929016
from timeit import timeit
import MySQLdb
ids = range(1000)
query_1 = "update test_table set last_modified=UTC_TIMESTAMP() where id=%(id)s"
query_2 = "update test_table set last_modified=UTC_TIMESTAMP() where id in (%s)" % ", ".join(('%s',) * len(ids))
db = MySQLdb.connect(host="localhost", user="some_user", passwd="some_pwd", db="test_db")
def b1():
curs = db.cursor()
curs.executemany(query_1, ids)
db.close()
def b2():
curs = db.cursor()
curs.execute(query_2, ids)
db.close()
print "b1: %s" % str(timeit(lambda:b1(), number=30))
print "b2: %s" % str(timeit(lambda:b2(), number=30))
01との間にこのような大きな違いがあるのはなぜですかおよびIN
節?
私はPython 2.6.6とMySQL-python 1.2.3を使用しています。
唯一の関連する質問は、Why is executemany slow in Python MySQLdb?でしたが、それは実際に私が後にしたものではありません。
重要な違いは、 'executemany'は単一のデータベースの往復を保証しないということです。その努力がしばしば「実際の単一の声明の往復」ではない「ベストエフォート」です。 https://stackoverflow.com/questions/4101076/executemany-confusion – pvg