我有以下代码,在第一个查询的结果集循环中执行另一个查询 表1有35K条记录,而表2有4M条记录
db = MySQLdb.connect("localhost","root","root","test" )
cursor1 = db.cursor(MySQLdb.cursors.DictCursor)
cursor2 = db.cursor(MySQLdb.cursors.DictCursor)
sql = 'select * from table1 limit 2'
cursor1.execute(sql)
results = cursor1.fetchall()
for row in results:
sql2 = 'select * from table2 where t1 = '+row['t1']
cursor2.execute(sql2)
result2 = cursor2.fetchall()
for row2 in result2
#do something
对于每个迭代和每个查询,流程似乎都在等待。我尝试用cProfile分析,得到了以下输出之一
ncalls tottime percall cumtime percall filename:lineno(function)
3 21.529 7.176 21.529 7.176 connections.py:274(query)
如何调试这个问题?我对Python很陌生。你知道吗
在web应用程序中嵌套查询从来不是一个好主意。正如您所发现的,它会扼杀性能。你知道吗
尝试使用联接表1和表2的单个查询。然后,以编程方式跟踪父数据何时更改以处理换行符或显示更改。你知道吗
1)对表1使用left join从表2中获得所需的结果
2)获取结果并做你想做的事情。你知道吗
3)*如果没有索引,请添加它们(以防万一)
一些建议:SQL是根据并集理论创建的。但是,游标设置为循环。所以如果你使用for循环太多次。这将导致您的命令急剧减慢。优化很棘手。基本上,使用内置函数可以提高性能(除非有些复杂的情况)
尝试基于并集理论(Join/Merge/)而不是这里的一些脚本语言模式来解决问题,这样会大大加快脚本的速度。你知道吗
相关问题 更多 >
编程相关推荐