MySQL结果集默认情况下是在完成任何工作之前从服务器完全检索的。如果结果集很大,这将变得不可用。相反,我想从服务器中一个一个地检索行。
在Java中,按照here(在“ResultSet”下)的说明,我创建了这样一个语句:stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
这在Java中运行得很好。我的问题是:在python中是否有相同的方法?
我试图将查询限制为一次1000行,如下所示:start_row = 0
while True:
cursor = conn.cursor()
cursor.execute("SELECT item FROM items LIMIT %d,1000" % start_row)
rows = cursor.fetchall()
if not rows:
break
start_row += 1000
# Do something with rows...
然而,这似乎越来越慢,更高的起点是。
不,使用fetchone()而不是fetchall()不会改变任何东西。
澄清:
我用来重现此问题的原始代码如下所示:import MySQLdb
conn = MySQLdb.connect(user="user", passwd="password", db="mydb")
cur = conn.cursor()
print "Executing query"
cur.execute("SELECT * FROM bigtable");
print "Starting loop"
row = cur.fetchone()
while row is not None:
print ", ".join([str(c) for c in row])
row = cur.fetchone()
cur.close()
conn.close()
在大约700000行的表中,此代码运行得很快。但在一个大约900万行的表上,它会打印“Executing Query”,然后挂起很长一段时间。这就是为什么我使用fetchone()或fetchall()没有区别的原因。