最近做一个查询小工具时,发现查询效率低下,查看日志输出后,定位问题到其中一段循环遍历逻辑。
self.logger.info("Execute sql %s", sql)
result = {}
for record in cur.execute(sql):
row = {}
for i, field in enumerate(self.fields_ajjbxx):
row[field] = record[i]
result[record[0]] = row
cur.close()
conn.close()
return result
开始以为是其中多层循环嵌套的问题,在将循环单独提取出来测试发现循环的效率是挺快的。问题原因是execute方法。
Python的cursor对象在执行execute方法后,并不是一次性将所有的记录取出,而是分段取出,默认一次取50条。也就是说在数据量较大时,会不停的与数据库开启关闭连接。造成效率低下的问题。
通过cursor对象API:
常用方法:
close():关闭此游标对象
fetchone():得到结果集的下一行
fetchmany([size = cursor.arraysize]):得到结果集的下几行
fetchall():得到结果集中剩下的所有行
excute(sql[, args]):执行一个数据库查询或命令
excutemany(sql, args):执行多个数据库查询或命令
常用属性:
connection:创建此游标对象的数据库连接
arraysize:使用fetchmany()方法一次取出多少条记录,默认为1
lastrowid:相当于PHP的last_inset_id()