在python中经常执行批量sql查询命令,原先采用的包是MysqlDB这个,
采用的方式:
import MySQLdb as mdb
connect = mdb.connect(user='username', password='password',
host='localhost', database='database_name',charset="utf8")
# sqlS都是经过处理的sql语句,数据都已经填充好了
sqls = ["select .....","select .....","select ....."]
cur = connect.cursor()
results = []
for sql in sqls:
cur.execute(sql)
rows = cur.fetchall()
results.append(rows)
如果采用预编译的方式是:
import time
import mysql.connector
# 连接MySQL数据库 ,,,
cnx = mysql.connector.connect(user='username', password='password',
host='localhost', database='database_name')
# 创建游标对象
cursor = cnx.cursor(prepared=True)
# 预编译SQL语句
query = ("select * from login_table where user_id =%s")
useids = [1,2,3,4,.....]
params = [(i,) for i in useids]
t = time.time()
results =[]
try:
for i in params:
cursor.execute(query, i)
data = cursor.fetchall()
results.append(data)
except Exception as e:
print(f"error:{e}")
finally:
cursor.close()
cnx.close()
t2 = time.time()
print(f"cost:{t2-t}")
按道理说预编译在进行批量执行的时候,速度会提升才对,但是经过实际测试:1000条用户数据,同样的sql语句。
第一段代码执行时间 均值是 19秒,
第二段采用预编译的执行时间是40秒。预编译的速度竟然慢了这么多。很奇怪。难道是预编译有错?
看来优化的王道还是尽量减少sql的执行次数,比方说,把一条条的执行修改为 userid in (一批userId)。