嵌套SQL查询太多

2024-05-08 19:11:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码,在第一个查询的结果集循环中执行另一个查询 表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很陌生。你知道吗


Tags: fromexecutedbsql记录rootselectcursor
2条回答

在web应用程序中嵌套查询从来不是一个好主意。正如您所发现的,它会扼杀性能。你知道吗

尝试使用联接表1和表2的单个查询。然后,以编程方式跟踪父数据何时更改以处理换行符或显示更改。你知道吗

1)对表1使用left join从表2中获得所需的结果

2)获取结果并做你想做的事情。你知道吗

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

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

尝试基于并集理论(Join/Merge/)而不是这里的一些脚本语言模式来解决问题,这样会大大加快脚本的速度。你知道吗

相关问题 更多 >

    热门问题