Python 嵌套SQL查询太慢

Python 嵌套SQL查询太慢,python,mysql,Python,Mysql,我有以下代码,在第一个查询的结果集循环中执行另一个查询 表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.ex

我有以下代码,在第一个查询的结果集循环中执行另一个查询 表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的左连接从表2中获得所需的结果

2) 获取结果并执行您想要的操作

3) *如果没有索引,请添加它们(以防万一)

一些建议:SQL是根据联合理论创建的。但是,光标设置为循环。所以,如果您使用for循环太多次。这将导致您的命令急剧减慢。优化很棘手。基本上,使用内置函数将提高性能(除非某些复杂情况)


尝试基于联合理论(Join/Merge/)而不是此处的某些脚本语言模式来解决问题,您将大大加快脚本速度。

为什么要这样运行嵌套查询?为什么不能运行单个
join
ed查询?是否使用索引?不要手动连接字符串以形成查询。使用占位符。
表2中的
t1
是否已编制索引?如果没有,您将执行一些大量的序列扫描。我知道我将触发35K个额外的查询。但是现在我只是用2条记录(
limit2
)测试它,需要15秒的时间来固定索引,从而提高了一些性能。我正在更深入地研究它。还将尝试占位符first select限制为2,因此嵌套不是什么大问题。我的假设是2的限制用于测试,因为查询上没有任何其他限制。使用“select*”也是个坏主意。您通常不需要表中的每一列,这只是在DB和应用服务器之间来回发送更多的数据。这是关系代数。谢谢分享。你是对的。