默认情况下,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中有没有同样的方法?
我try 过的一件事是将查询限制为每次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行的表上,这段代码运行得很快.但在大约9000000行的表上,它打印"正在执行的查询",然后挂起很长时间.这就是为什么我用fetchone()
或fetchall()
没有区别.