今天试了下PyMySQL、MySQLdb、MySQLdb的速度感觉。
PyMySQL是纯Python实现的.
MySQLdb是C写的.网上都说支持到py3.4,其实3.5+也支持的,只要安装mysqlclient pip install mysqlclient
,mysqlclient是在MySQLdb基础上fork继续开发的.
想必看到这个,不言而喻了吧,但在python中还是很流行使用pymysql,所以我就好奇试试。
下面是结果:
我这只测试了500次,其中未使用连接池的是每次连接数据库,执行查询。使用连接池的是使用DBUtils2.0
版本的PooledDB
连接池。
数据库是MySQL中一个含有250几万条数据的表,执行语句:SELECT * FROM tb_name limit 200;
下面贴出代码:有问题欢迎指正。
# _*_ coding:utf-8 _*_
# @File : testdb.py
# @Time : 2020-12-15 09:15
# @Author: zizle
""" 测试pymsql与mysqlclient """
import sys
import pymysql
import MySQLdb
from MySQLdb.converters import conversions
from dbutils.pooled_db import PooledDB
def mysqlclient_converters():
from MySQLdb.constants import FIELD_TYPE
conversions[FIELD_TYPE.BIT] = lambda x: 1 if int.from_bytes(x, byteorder=sys.byteorder, signed=False) else 0
return conversions
def pymysql_converters():
from pymysql.converters import FIELD_TYPE, conversions
conversions[FIELD_TYPE.BIT] = lambda x: 1 if int.from_bytes(x, byteorder=sys.byteorder, signed=False) else 0
return conversions
def test_mysqlclient():
db = MySQLdb.Connection(
host='localhost', port=3306, user='root', passwd='mysql', db='realexchangelib', charset='utf8',
conv=mysqlclient_converters()
)
return db
def test_pymysql():
connect = pymysql.Connection(
host='localhost', port=3306, user='root', passwd='mysql', db='realexchangelib', charset='utf8',
conv=pymysql_converters()
)
return connect
# MySQLdb连接池
pool = PooledDB(
creator=MySQLdb, mincached=5, maxcached=10,
host='localhost', port=3306, user='root', passwd='mysql', db='realexchangelib', charset='utf8',
conv=mysqlclient_converters()
)
if __name__ == '__main__':
import time
client_sum = 0
pymysql_sum = 0
pool_sum = 0
for i in range(500):
print('第{}次'.format(i + 1))
s = time.time()
mysqlclient_db = test_mysqlclient()
cursor = mysqlclient_db.cursor(MySQLdb.cursors.DictCursor)
cursor.execute(
"SELECT * FROM czce_rank limit 200;"
)
e = time.time()
data = list(cursor.fetchall())
# print(data)
# print(data)
client_sum += (e - s)
print('MySQLdb执行耗时{}秒'.format(e - s))
cursor.close()
mysqlclient_db.close()
# print('' * 30)
ps = time.time()
pymsql_db = test_pymysql()
p_cursor = pymsql_db.cursor(pymysql.cursors.DictCursor)
p_cursor.execute(
"SELECT * FROM czce_rank limit 200;"
)
pe = time.time()
pymysql_sum += (pe - ps)
p_data = list(p_cursor.fetchall())
# print(p_data)
# print(data)
print('PyMySQL执行耗时{}秒'.format(pe - ps))
p_cursor.close()
pymsql_db.close()
# 连接池执行
poo_conn = pool.connection()
poo_cursor = poo_conn.cursor(MySQLdb.cursors.DictCursor)
poos = time.time()
poo_cursor.execute(
"SELECT * FROM czce_rank limit 200;"
)
pooe = time.time()
pool_sum += (pooe - poos)
poo_data = list(poo_cursor.fetchall())
# print(poo_data)
print('MySQLdb连接池执行耗时{}秒'.format(pooe - poos))
poo_cursor.close()
poo_conn.close()
print('-' * 30)
print('500次执行完毕!')
print('PyMySQL平均耗时:{}'.format(pymysql_sum / 200))
print('MySQLdb平均耗时:{}'.format(client_sum / 200))
print('MySQLdb连接池执行平均耗时:{}'.format(pool_sum / 200))