侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python测试mysql写入性能完整实例

Python  /  管理员 发布于 7年前   215

本文主要研究的是python测试mysql写入性能,分享了一则完整代码,具体介绍如下。

测试环境:

(1) 阿里云服务器centos 6.5

(2) 2G内存

(3) 普通硬盘

(4) mysql 5.1.73 数据库存储引擎为 InnoDB

(5) python 2.7

(6) 客户端模块 mysql.connector

测试方法:

(1) 普通写入

(2) 批量写入

(3) 事务加批量写入

普通写入:

def ordinary_insert(count):   sql = "insert into stu(name,age,class)values('test mysql insert',30,8)"   for i in range(count):     cur.execute(sql) 

批量写入,每次批量写入20条数据

def many_insert(count):   sql = "insert into stu(name,age,class)values(%s,%s,%s)"    loop = count/20   stus = (('test mysql insert', 30, 30), ('test mysql insert', 30, 31), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32)          ,('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32),          ('test mysql insert', 30, 32), ('test mysql insert', 30, 32)         ,('test mysql insert', 30, 30), ('test mysql insert', 30, 31), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32)          ,('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32),          ('test mysql insert', 30, 32), ('test mysql insert', 30, 32))   #并不是元组里的数据越多越好   for i in range(loop):     cur.executemany(sql, stus) 

事务加批量写入,每次批量写入20条数据,每20个批量写入作为一次事务提交

def transaction_insert(count):   sql = "insert into stu(name,age,class)values(%s,%s,%s)"   insert_lst = []   loop = count/20    stus = (('test mysql insert', 30, 30), ('test mysql insert', 30, 31), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32)          ,('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32),          ('test mysql insert', 30, 32), ('test mysql insert', 30, 32)         ,('test mysql insert', 30, 30), ('test mysql insert', 30, 31), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32)          ,('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32),          ('test mysql insert', 30, 32), ('test mysql insert', 30, 32))   #并不是元组里的数据越多越好   for i in range(loop):     insert_lst.append((sql,stus))     if len(insert_lst) == 20:       conn.start_transaction()       for item in insert_lst:         cur.executemany(item[0], item[1])       conn.commit()       print '0k'       insert_lst = []    if len(insert_lst) > 0:     conn.start_transaction()     for item in insert_lst:       cur.executemany(item[0], item[1])     conn.commit() 

实验结果如下

数量  普通写入   many写入  事务加many写入 1万  26.7s  1.7s    0.5s 10万  266s   19s    5s 100万 2553s   165s    49s 

批量写入,相比于普通的多次写入,减少了网络传输次数,因而写入速度加快。

不论是单次写入还是批量写入,数据库内部都要开启一个事务以保证写入动作的完整,如果在应用层,我们自己开启事物,那么就可以避免每一次写入数据库自己都开启事务的开销,从而提升写入速度。

事务加批量写入速度大概是批量写入速度的3倍,是普通写入的50倍。

完整的测试代码如下:

#coding=utf-8 ''''' 采用三种方法测试mysql.connector对mysql的写入性能,其他的例如mysqldb和pymysql客户端库的写入性能应该和mysql.connector一致 采用批量写入时,由于减少了网络传输的次数因而速度加快 开启事务,多次写入后再提交事务,其写入速度也会显著提升,这是由于单次的insert,数据库内部也会开启事务以保证一次写入的完整性 如果开启事务,在事务内执行多次写入操作,那么就避免了每一次写入都开启事务,因而也会节省时间 从测试效果来看,事务加批量写入的速度大概是批量写入的3倍,是普通写入的50倍 数量  普通写入   many写入  事务加many写入 1万  26.7s  1.7s    0.5s 10万  266s   19s    5s 100万 2553s   165s    49s  将autocommit设置为true,执行insert时会直接写入数据库,否则在execute 插入命令时,默认开启事物,必须在最后commit,这样操作实际上减慢插入速度 此外还需要注意的是mysql的数据库存储引擎如果是MyISAM,那么是不支持事务的,InnoDB 则支持事务 ''' import time import sys import mysql.connector reload(sys) sys.setdefaultencoding('utf-8')  config = {     'host': '127.0.0.1',     'port': 3306,     'database': 'testsql',     'user': 'root',     'password': 'sheng',     'charset': 'utf8',     'use_unicode': True,     'get_warnings': True,     'autocommit':True   }  conn = mysql.connector.connect(**config) cur = conn.cursor()  def time_me(fn):   def _wrapper(*args, **kwargs):     start = time.time()     fn(*args, **kwargs)     seconds = time.time() - start     print u"{func}函数每{count}条数数据写入耗时{sec}秒".format(func = fn.func_name,count=args[0],sec=seconds)   return _wrapper  #普通写入 @time_me def ordinary_insert(count):   sql = "insert into stu(name,age,class)values('test mysql insert',30,8)"   for i in range(count):     cur.execute(sql)    #批量 @time_me def many_insert(count):   sql = "insert into stu(name,age,class)values(%s,%s,%s)"    loop = count/20   stus = (('test mysql insert', 30, 30), ('test mysql insert', 30, 31), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32)          ,('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32),          ('test mysql insert', 30, 32), ('test mysql insert', 30, 32)         ,('test mysql insert', 30, 30), ('test mysql insert', 30, 31), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32)          ,('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32),          ('test mysql insert', 30, 32), ('test mysql insert', 30, 32))   #并不是元组里的数据越多越好   for i in range(loop):     cur.executemany(sql, stus)  #事务加批量 @time_me def transaction_insert(count):   sql = "insert into stu(name,age,class)values(%s,%s,%s)"   insert_lst = []   loop = count/20    stus = (('test mysql insert', 30, 30), ('test mysql insert', 30, 31), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32)          ,('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32),          ('test mysql insert', 30, 32), ('test mysql insert', 30, 32)         ,('test mysql insert', 30, 30), ('test mysql insert', 30, 31), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32)          ,('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32), ('test mysql insert', 30, 32),          ('test mysql insert', 30, 32), ('test mysql insert', 30, 32))   #并不是元组里的数据越多越好   for i in range(loop):     insert_lst.append((sql,stus))     if len(insert_lst) == 20:       conn.start_transaction()       for item in insert_lst:         cur.executemany(item[0], item[1])       conn.commit()       print '0k'       insert_lst = []    if len(insert_lst) > 0:     conn.start_transaction()     for item in insert_lst:       cur.executemany(item[0], item[1])     conn.commit()  def test_insert(count):   ordinary_insert(count)   many_insert(count)   transaction_insert(count)  if __name__ == '__main__':   if len(sys.argv) == 2:     loop = int(sys.argv[1])     test_insert(loop)   else:     print u'参数错误' 

总结

以上就是本文关于python测试mysql写入性能完整实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!


  • 上一条:
    python将字典内容存入mysql实例代码
    下一条:
    Python机器学习logistic回归代码解析
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客