我有以下代码,我在第一个查询的结果集循环中执行另一个查询 Table1有35K记录,而table2有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的新手。
答案 0 :(得分:-1)
在Web应用程序中嵌套查询绝不是一个好主意。正如您所发现的,它会导致性能下降。
尝试使用连接table1和table2的单个查询。然后,以编程方式跟踪父数据何时更改以处理换行符或显示更改。
答案 1 :(得分:-1)
1)使用table1的左连接从table2获得所需的结果
2)获取结果并做你想做的事。
3)*如果您没有索引,请添加它们(以防万一)
一些建议:SQL是在union理论上创建的。但是,Cursor设置为循环。所以如果你使用循环次数太多了。它会导致命令急剧减慢。优化很棘手。基本上,使用内置函数将提高性能(除非一些复杂的情况)
尝试在此处解决基于联合理论(Join / Merge / ..)而不是某些脚本语言模式的问题,并且您将加速脚本的加速。