默认情况下,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()没有区别.

推荐答案

我认为你必须连接cursorclass = MySQLdb.cursors.SSCursor:

 MySQLdb.connect(user="user", 
                 passwd="password",
                 db="mydb",
                 cursorclass = MySQLdb.cursors.SSCursor
                )

默认光标一次获取所有数据,即使不使用fetchall.

编辑:SSCursor或任何其他支持服务器端结果集的游标类-查看MySQLdb.cursors上的模块文档.

Mysql相关问答推荐

是否有一种方法可以在mysql中设置一列,使其自动成为该行的行号的值?

如何改进对另一个表中多行的查询依赖性

加载数据本地infile,字段中有双引号和逗号

为什么嵌套循环逻辑不能按预期工作

计算同一个表中的两列,然后将两者都算作总数

模拟Mysql Cursor类的fetchone()方法,并将其返回值设置为None

SQL - 基本的内部连接查询

检索按键列值分组的最新日期 (MySql)

MYSQL 删除两个已知字符串之间的字符串

在 SQL 中的 case 语句之后将新列转换为 INT

使用 JOIN 计算列中的所有值

如何判断嵌套查询返回的元组中的每个条目是否相同?

通过 Gorm 查询模型

使用 MySQL 流式传输大型结果集

如何在特定数据库中创建表?

MySQL 实用程序 - ~/.my.cnf 选项文件

phpMyAdmin - 无法连接 - 无效设置 - 自从我添加了 root 密码 - 被锁定

如何将 MySQL 查询结果存储在另一个表中?

将mysql查询输出存储到shell变量中

在 MySQL 的 LIMIT 子句中使用变量