我有一个包含 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"
使用游标作为迭代器(不调用fetchall
):
sql = "SELECT ID, Eye, Values FROM my_original_table"
curQuery.execute(sql)
for row in curQuery:
# ...
以上相当于使用 while 循环处理查询,fetchone
:
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()
根据文档:
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'),)