Mysql / python fetchall()无法处理结果,因为它太大

时间:2016-07-15 13:02:43

标签: python mysql bigdata database

我有一张2,760,000行的表格。在mysqlworkbench中,从原始表中选择*需要36秒。

我想在python中使用这个现有表创建另一个表(使用 my_func()来转换值。)

但是,当我在命令行中运行它时,它似乎永远不会完成。

sql = "SELECT ID, Eye, Values FROM my_original_table"
curQuery.execute(sql)

for row in curQuery.fetchall():        
    dat = list(row)
    id = dat.pop(0)
    eye = dat.pop(0)
    values = dat.pop(0)     
    v = my_func(values)
    if v != None :
        sql = "INSERT INTO new_table VALUES ( '%s', '%s', %d );" % (id, eye, v)
    print(sql)
    curExe.execute(sql)

db.commit()

但是,如果我将 LIMIT 0,10 添加到我的第一个选择sql(如下所示),它运行正常。所以,这意味着我的计划是正确的。但这是否意味着没有'限制',数据太多,我的电脑无法处理?我该如何解决这个问题?

sql = "SELECT ID, Eye, Values FROM ETCEpisodeVisualAcuity LIMIT 0,10"

2 个答案:

答案 0 :(得分:2)

使用游标作为迭代器(不调用fetchall):

sql = "SELECT ID, Eye, Values FROM my_original_table"
curQuery.execute(sql)

for row in curQuery:
    # ...
上面的

相当于使用带有fetchone的while循环处理查询:

curQuery.execute("SELECT ID, Eye, Values FROM my_original_table")
row = curQuery.fetchone()
while row is not None:
  # do something with data...
  row = curQuery.fetchone()

答案 1 :(得分:1)

根据documentation

  

db.store_result()将整个结果集返回给客户端   立即。如果你的结果集非常大,那么这可能是一个   问题。解决此问题的一种方法是在查询中添加LIMIT子句,   限制返回的行数。另一种是使用   use_result(),它将结果集保存在服务器中并发送它   您获取时逐行。但是,这会占用服务器   资源,它绑定了连接:你不能再做了   查询,直到您获取所有行。一般我推荐   使用store_result()除非你的结果集真的很大而且你   因某些原因无法使用LIMIT。

db = MySQLdb.connect(yourhost,yourname,yourpw,yourdb)

db.query("SELECT ID, Eye, Values FROM my_original_table")

r=db.use_result()

>>> r.fetch_row()
(('3','2','0'),)