欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于executemany()方法在不同OS和DB API下的不同表现的测试

程序员文章站 2022-09-21 22:55:24
昨天在参照着网上写一段关于MySQL连接池的配合gevent多线程调用的代码时遇到了一个问题,自己写的代码根本不能多线程执行,比单会话插入数据慢太多,直到今天早上才发现问题所在,把DB API从MySQLdb换为pymysql之后得到解决,因此测试了一下不同DB API和OS下executemany ......

昨天在参照着网上写一段关于mysql连接池的配合gevent多线程调用的代码时遇到了一个问题,自己写的代码根本不能多线程执行,比单会话插入数据慢太多,直到今天早上才发现问题所在,把db api从mysqldb换为pymysql之后得到解决,因此测试了一下不同db api和os下executemany()的表现,先贴一下剪短的测试代码:

# -*- coding: utf-8 -*-
import mysqldb
import pymysql
import time
conn=pymysql.connect(host='192.168.1.174',port=3306,user='leo',passwd='leo',db='leo',charset='utf8')
conn.autocommit(true)
start_time=time.time()
with conn as cursor:
    data=((i,"messi%s"%i) for i in range(10000))
    cursor.executemany("insert into test values(%s,%s);",data)
    cursor.execute("select count(*) from test;")
    print(cursor.fetchall())
print("elapsed time: ",(time.time()-start_time))

以上一段代码在python2、3通用,通过开启general log来观察sql和事务状态。

使用不同版本的解释器执行测试的结果如下:

关于executemany()方法在不同OS和DB API下的不同表现的测试

其他db api诸如sqlalchemy等未进行测试。

其实之前忘了在哪里也看到过在python3中mysqlclient、mysqldb之间的关系,但是如此混乱的版本表现确实很恶心。

此外,在python2中如果将executemany()封装入连接池类中,表现又有所不同,多条sql会在同一个会话中分为多个事务依次执行。

总结起来暂时就一句话:尽量使用python3的mysqldb module。