嵌套SQL查询太慢了

时间:2016-09-07 19:07:35

标签: python mysql

我有以下代码,我在第一个查询的结果集循环中执行另一个查询 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的新手。

2 个答案:

答案 0 :(得分:-1)

在Web应用程序中嵌套查询绝不是一个好主意。正如您所发现的,它会导致性能下降。

尝试使用连接table1和table2的单个查询。然后,以编程方式跟踪父数据何时更改以处理换行符或显示更改。

答案 1 :(得分:-1)

1)使用table1的左连接从table2获得所需的结果

2)获取结果并做你想做的事。

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

一些建议:SQL是在union理论上创建的。但是,Cursor设置为循环。所以如果你使用循环次数太多了。它会导致命令急剧减慢。优化很棘手。基本上,使用内置函数将提高性能(除非一些复杂的情况)

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