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

本文主要研究的是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 操作MySQL详解及实例
  • Python操作使用MySQL数据库的实例代码
  • 在python3环境下的Django中使用MySQL数据库的实例
  • Python如何实现MySQL实例初始化详解
  • python 3.6 +pyMysql 操作mysql数据库(实例讲解)
  • python3.6连接MySQL和表的创建与删除实例代码
  • python将字典内容存入mysql实例代码
时间: 2018-01-17

Python操作使用MySQL数据库的实例代码

Python 操作 MySQL 配置 win_64 Ubuntu14.04 Python3.x pip安装pymysql模块 直接使用pip安装 pip install pymysql win64上直接在cmd中执行 连接本地数据库 使用模块pymysql连接数据库 #!/usr/bin/python # coding=utf-8 import pymysql # 连接本地数据库 conn = pymysql.connect(host='localhost', port=3306, user='

在python3环境下的Django中使用MySQL数据库的实例

我们在使用Django过程中,数据库往往是离不开的,比较长常用的是MySQL数据库,但在使用过程中,对Python不同的版本对用的库也不一样,用惯了Python2的人在使用Python3时经常会遇到下面的错误: Error loading MySQLdb module: No module named 'MySQLdb'. 这是因为Python3 MySQL的支持库为pymysql所致,所以我们要下载pymysql数据库. 并且在站点文件夹下的__init__.py(project同名目录下,而

python将字典内容存入mysql实例代码

本文主要研究的是python将字典内容存入mysql,分享了实现代码,具体介绍如下. 1.背景 项目需要,用python实现了将字典内容存入本地的mysql数据库.比如说有个字典dic={"a":"b","c":"d"},存入数据库效果图如下: 2.代码 ''''' Insert items into database @author: hakuri ''' import MySQLdb def InsertData(Tabl

Python实现Mysql数据库连接池实例详解

python连接Mysql数据库: Python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接MySQL数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响.因此,实际使用中,通常会使用数据库的连接池技术,来访问数据库达到资源复用的目的. 数据库连接池 python的数据库连接池包 DBUtils: DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装.D

python3.6连接MySQL和表的创建与删除实例代码

python3.6不支持importMySQLdb改用为importpymysql模块,需要自行安装模块pymysql. 1:python3.6安装模块pymysql 命令行安装pipinstallpymysql 2:python3.6连接mysql数据库 #!/bin/env Python # -*- coding:utf-8 -*- import pymysql conn = pymysql.connect( user="root", password="root@123

Python如何实现MySQL实例初始化详解

前言 相信每位程序员对mysql应该都不陌生,MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.我们在日常开发中少不了要接触mysql. 腾讯云上的mysql实例,初始化的时候,需要自己点击"初始化按钮",然后还要手动输入16位复杂的密码,这个操作比较繁琐,而且如果你一次建立多个实例,这个操作量就很大了,所以必须想办法提高效率,于是就有了下文,批量调用sdk api来实现. 本文主要给大家介绍了关于Python实现MySQL实例初

python 3.6 +pyMysql 操作mysql数据库(实例讲解)

版本信息:python:3.6 mysql:5.7 pyMysql:0.7.11 ################################################################# #author: 陈月白 #_blogs: http://www.cnblogs.com/chenyuebai/ ################################################################# # -*- coding: utf-8

Python 操作MySQL详解及实例

Python 操作MySQL详解及实例 使用Python进行MySQL的库主要有三个,Python-MySQL(更熟悉的名字可能是MySQLdb),PyMySQL和SQLAlchemy. Python-MySQL资格最老,核心由C语言打造,接口精炼,性能最棒,缺点是环境依赖较多,安装复杂,近两年已停止更新,只支持Python2,不支持Python3. PyMySQL为替代Python-MySQL而生,纯python打造,接口与Python-MySQL兼容,安装方便,支持Python3. SQLA

Python操作MongoDB详解及实例

Python操作MongoDB详解及实例 由于需要在页面展示MongoDB库里的数据,所以考虑使用python操作MongoDB,PyMongo模块是Python对MongoDB操作的接口包,所以首页安装pymongo. 1.安装命令 pip install pymongo 2.查询命令: import pymongo # 创建连接 client = pymongo.MongoClient(host="10.0.2.38", port=27017) # 连接probeb库 db = c

Python 文件操作的详解及实例

Python 文件操作的详解及实例 一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧明. 白首为功名,旧山松竹老,阻归程. 欲将心事付瑶琴. 知音少,弦断有谁听. f = open('小重山') #打开文件 data=f.read()#获取文件内容 f.close() #关闭文件 注意:if in the win,hello文件是utf8保存的,打

Python 登录网站详解及实例

Python 登录网站详解及实例 对于大部分论坛,我们想要抓取其中的帖子分析,首先需要登录,否则无法查看. 这是因为 HTTP 协议是一个无状态(Stateless)的协议,服务器如何知道当前请求连接的用户是否已经登录了呢?有两种方式: 在URI 中显式地使用 Session ID: 利用 Cookie,大概过程是登录一个网站后会在本地保留一个 Cookie,当继续浏览这个网站的时候,浏览器会把 Cookie 连同地址请求一起发送过去. Python 提供了相当丰富的模块,所以对于这种网络操作只

Servlet中操作文件详解及实例

Servlet中操作文件详解及实例 因为Servlet本来就是一个.Java文件,因此servlet中操作文件和普通java文件操作文件是一样的. 读取文件主要代码: FileReader f=new FileReader("f:\\lissdy.txt"); BufferedReader bw=new BufferedReader(f); 读出一行数据 String num=bw.readLine(); 注意一定要关闭文件流 bw.close(); 写文件的方法与之类似,具体代码为:

javascript 操作cookies详解及实例

javascript 操作cookies详解 这段操作cookies的方法我使用很久了,但是一直一来没遇到什么问题,今天在做一个在第一个页面保存了cookies,第二个页面获取或者第三个页面获取的功能中,发现了方法的局限性,比如,第一个页面路径为 http://xxxxx/cyb-car2016/h5OfficeWorker/index,第二个页面路径为 http://xxxxx/cyb-car2016/h5AlertController/index,其中除了域名是一样之外,还有一个命名空间不一

Python heapq使用详解及实例代码

 Python heapq 详解 Python有一个内置的模块,heapq标准的封装了最小堆的算法实现.下面看两个不错的应用. 小顶堆(求TopK大) 话说需求是这样的: 定长的序列,求出TopK大的数据. import heapq import random class TopkHeap(object): def __init__(self, k): self.k = k self.data = [] def Push(self, elem): if len(self.data) < self

Python运算符重载详解及实例代码

Python运算符重载 Python语言提供了运算符重载功能,增强了语言的灵活性,这一点与C++有点类似又有些不同.鉴于它的特殊性,今天就来讨论一下Python运算符重载. Python语言本身提供了很多魔法方法,它的运算符重载就是通过重写这些Python内置魔法方法实现的.这些魔法方法都是以双下划线开头和结尾的,类似于__X__的形式,python通过这种特殊的命名方式来拦截操作符,以实现重载.当Python的内置操作运用于类对象时,Python会去搜索并调用对象中指定的方法完成操作. 类可以

Python 爬虫多线程详解及实例代码

python是支持多线程的,主要是通过thread和threading这两个模块来实现的.thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用. 虽然python的多线程受GIL限制,并不是真正的多线程,但是对于I/O密集型计算还是能明显提高效率,比如说爬虫. 下面用一个实例来验证多线程的效率.代码只涉及页面获取,并没有解析出来. # -*-coding:utf-8 -*- import urllib2, time import thread

Python 实现随机数详解及实例代码

Python3实现随机数 random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串. random.seed(x)改变随机数生成器的种子seed. 一般不必特别去设定seed,Python会自动选择seed. random.random() 用于生成一个随机浮点数n,0 <= n < 1 random.uniform(a,b) 用于生成一个指定范围内的随机浮点数,生成的随机整数a<=n<=b; random.randint(a,b) 用于生成一个指定范围内的整数,a