使用Python如何测试InnoDB与MyISAM的读写性能


Posted in Python onSeptember 18, 2018

前言

由于近期有个项目对系统性能要求很高,技术选型上由于种种原因已经确定使用Mysql数据库,接下来就是要确定到底使用哪种存储引擎。我们的应用是典型的写多读少,写入内容为也很短,对系统的稳定性要求很高。所以存储引擎肯定就定在广泛使用的Innodb和MyISAM之中了。

至于两者的比较网上也有很多,但是毕竟这个事情也不复杂,决定还是自己来做,去验证一下在我们的场景下谁更优。

本文测试所用工具版本如下:

Tools Version
MySQL 5.7.18
Python 3.6
Pandas 0.23

① 创建数据表

首先我们需要把两张使用了不同引擎的表创建出来,使用为了方便起见,我们直接使用Navicat创建了两张 员工信息表,具体字段如下:

使用Python如何测试InnoDB与MyISAM的读写性能

使用InnoDB引擎的表,设计表名为innodb,选项如下:

 使用Python如何测试InnoDB与MyISAM的读写性能

使用InnoDB引擎的表,设计表名为myisam,选项如下:

使用Python如何测试InnoDB与MyISAM的读写性能 

因为是简单操作,创建的具体细节就不详述了,至此,我们的数据库就把使用 InnoDB 和 MyISAM 两种引擎的表创建好了。

② 单线程写入性能对比

1. InnoDB 引擎

执行以下代码,往使用了InnoDB引擎的表格插入1000条数据

import pandas as pd
from sqlalchemy import create_engine
import time

db = create_engine('mysql+pymysql://mysql:123456@127.0.0.1:3306/test')
start = time.time()

for i in range(1000):
 data = {'index': i,
   'name': 'name_' + str(i),
   'age': i,
   'salary': i,
   'level': i}
 df = pd.DataFrame(data, index=[0])
 df.to_sql('innodb', db, if_exists='append', index=False)

end = time.time()
print(end - start)

执行3次上面的代码,得到程序写入1000条数据的时间分别为:12.58s、14.10s、12.71s,平均写入时间为 13.13s。

2. MyISAM 引擎

执行以下代码,往使用了MyISAM引擎的表格插入1000条数据

import pandas as pd
from sqlalchemy import create_engine
import time

db = create_engine('mysql+pymysql://mysql:123456@127.0.0.1:3306/test')
start = time.time()

for i in range(1000):
 data = {'index': i,
   'name': 'name_' + str(i),
   'age': i,
   'salary': i,
   'level': i}
 df = pd.DataFrame(data, index=[0])
 df.to_sql('myisam', db, if_exists='append', index=False)

end = time.time()
print(end - start)

执行3次上面的代码,得到程序写入1000条数据的时间分别为:6.64s、6.99s、7.29s,平均写入时间为 6.97s。

两种引擎的单线程写入速度对比如下:

使用Python如何测试InnoDB与MyISAM的读写性能

结论:单线程的情况下,MyISAM引擎的写入速度比InnoDB引擎的写入速度快88%

③ 多线程写入性能对比

1. InnoDB 引擎

执行以下代码,往使用了InnoDB引擎的表格插入1000条数据

import pandas as pd
from sqlalchemy import create_engine
import time
from concurrent.futures import ThreadPoolExecutor

db = create_engine('mysql+pymysql://mysql:123456@127.0.0.1:3306/test')
start = time.time()

data_lst = [{'index': i,
    'name': 'name_' + str(i),
    'age': i,
    'salary': i,
    'level': i} for i in range(1000)]

def write(data):
 df = pd.DataFrame(data, index=[0])
 df.to_sql('innodb', db, if_exists='append', index=False)

def execute():
 with ThreadPoolExecutor(max_workers=5) as executor:
  executor.map(write, data_lst)

execute()

end = time.time()
print(end - start)

执行3次上面的代码,得到程序写入1000条数据的时间分别为:4.98s、4.84s、4.88s,平均写入时间为 4.9s。

2. MyISAM 引擎

执行以下代码,往使用了MyISAM引擎的表格插入1000条数据

import pandas as pd
from sqlalchemy import create_engine
import time
from concurrent.futures import ThreadPoolExecutor

db = create_engine('mysql+pymysql://mysql:123456@127.0.0.1:3306/test')
start = time.time()

data_lst = [{'index': i,
    'name': 'name_' + str(i),
    'age': i,
    'salary': i,
    'level': i} for i in range(1000)]

def write(data):
 df = pd.DataFrame(data, index=[0])
 df.to_sql('myisam', db, if_exists='append', index=False)

def execute():
 with ThreadPoolExecutor(max_workers=5) as executor:
  executor.map(write, data_lst)

execute()

end = time.time()
print(end - start)

执行3次上面的代码,得到程序写入1000条数据的时间分别为:3.29s、3.62s、3.47s,平均写入时间为 3.46s。

两种引擎的多线程写入速度对比如下:

使用Python如何测试InnoDB与MyISAM的读写性能

结论:多线程的情况下,MyISAM引擎的写入速度比InnoDB引擎的写入速度快42%

④ 读取性能对比

为了获得数据量较大的表用于测试数据库的读取性能,我们循环执行10遍上面多线程写入数据的操作,得到两张数据量为10000条数据的表格,然后读取10遍该表格,获取读取时间

1. InnoDB 引擎

执行以下代码,读取10遍使用了InnoDB引擎的表格

import pandas as pd
from sqlalchemy import create_engine
import time

db = create_engine('mysql+pymysql://mysql:123456@127.0.0.1:3306/test')
start = time.time()

for _ in range(10):
 df = pd.read_sql('innodb', db)

end = time.time()
print(end - start)

执行3次上面的代码,得到程序10次读取10000条数据的时间分别为:28.94s、28.88s、28.48s,平均写入时间为 28.77s。

2. MyISAM 引擎

执行以下代码,读取10遍使用了MyISAM引擎的表格

import pandas as pd
from sqlalchemy import create_engine
import time

db = create_engine('mysql+pymysql://mysql:123456@127.0.0.1:3306/test')
start = time.time()

for _ in range(10):
 df = pd.read_sql('innodb', db)

end = time.time()
print(end - start)

执行3次上面的代码,得到程序10次读取10000条数据的时间分别为:28.51s、29.12s、28.76s,平均写入时间为 28.8s。

两种引擎的读取速度对比如下:

使用Python如何测试InnoDB与MyISAM的读写性能

结论:MyISAM引擎和InnoDB引擎的读取速度无明显差异

⑤ 总结

1. 写入速度,MyISAM比InnoDB快,单线程的情况下,两者差异尤为明显

2. 读取速度,InnoDB和MyISAM无明显差异

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python函数学习笔记
Oct 07 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 Python
Python程序运行原理图文解析
Feb 10 Python
Django框架的使用教程路由请求响应的方法
Jul 03 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
tornado+celery的简单使用详解
Dec 21 Python
Python使用enumerate获取迭代元素下标
Feb 03 Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 Python
Python reversed反转序列并生成可迭代对象
Oct 22 Python
Python 微信公众号文章爬取的示例代码
Nov 30 Python
Django+Django-Celery+Celery的整合实战
Jan 20 Python
浅述python中深浅拷贝原理
Sep 18 #Python
python实现指定文件夹下的指定文件移动到指定位置
Sep 17 #Python
python批量复制图片到另一个文件夹
Sep 17 #Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 #Python
influx+grafana自定义python采集数据和一些坑的总结
Sep 17 #Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 #Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 #Python
You might like
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
php下实现伪 url 的超简单方法[转]
2007/09/24 PHP
PHP 加密与解密的斗争
2009/04/17 PHP
PHP冒泡排序算法代码详细解读
2011/07/17 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
php页面缓存方法小结
2015/01/10 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
让您的菜单不离网站
2006/10/03 Javascript
Prototype Object对象 学习
2009/07/12 Javascript
让textarea自动调整大小的js代码
2011/04/12 Javascript
基于jQuery判断两个元素是否有重叠部分的代码
2012/07/25 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
JS之相等操作符详解
2016/09/13 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
Python分治法定义与应用实例详解
2017/07/28 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
explicit和implicit的含义
2012/11/15 面试题
中专自我鉴定
2014/02/05 职场文书
拓展策划方案
2014/06/03 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
宪法宣传标语100条
2019/10/15 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
Nginx进程调度问题详解
2021/09/25 Servers