使用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实现二分查找与bisect模块详解
Jan 13 Python
python 上下文管理器使用方法小结
Oct 10 Python
200 行python 代码实现 2048 游戏
Jan 12 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 Python
Python爬虫之pandas基本安装与使用方法示例
Aug 08 Python
Django的用户模块与权限系统的示例代码
Jul 24 Python
Python3 JSON编码解码方法详解
Sep 06 Python
python使用pip安装SciPy、SymPy、matplotlib教程
Nov 20 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
python随机生成大小写字母数字混合密码(仅20行代码)
Feb 01 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 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
简单的php中文转拼音的实现代码
2014/02/11 PHP
php实现的树形结构数据存取类实例
2014/11/29 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
tp5框架基于ajax实现异步删除图片的方法示例
2020/02/10 PHP
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
js控制表单不能输入空格的小例子
2013/11/20 Javascript
JavaScript中的类(Class)详细介绍
2014/12/30 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
python 判断一个进程是否存在
2009/04/09 Python
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
Python正则表达式使用经典实例
2016/06/21 Python
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
广告学专业应届生求职信
2013/10/01 职场文书
考核工作实施方案
2014/03/30 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
2014年话务员工作总结
2014/11/19 职场文书
律师函格式范本
2015/05/27 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android