使用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实现微信公众平台自定义菜单实例
Mar 20 Python
python机器学习库常用汇总
Nov 15 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
对python实现模板生成脚本的方法详解
Jan 30 Python
Python使用reportlab模块生成PDF格式的文档
Mar 11 Python
python实现两张图片拼接为一张图片并保存
Jul 16 Python
Python Web程序搭建简单的Web服务器
Jul 31 Python
详解用python计算阶乘的几种方法
Aug 14 Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 Python
Python 解码Base64 得到码流格式文本实例
Jan 09 Python
python 贪心算法的实现
Sep 18 Python
Django migrate报错的解决方案
May 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
PHP实现微信发红包程序
2015/08/24 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
JavaScript实现的石头剪刀布游戏源码分享
2014/08/22 Javascript
javascript数组去重方法汇总
2015/04/23 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
JS 60秒后重新发送验证码的实例讲解
2017/07/26 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
javascript for循环性能测试示例
2019/08/07 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
微信小程序纯文本实现@功能
2020/04/08 Javascript
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
python实现控制COM口的示例
2019/07/03 Python
Django中多种重定向方法使用详解
2019/07/17 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
python rolling regression. 使用 Python 实现滚动回归操作
2020/06/08 Python
HTML5 embed标签定义和用法详解
2014/05/09 HTML / CSS
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
教师辞职报告范文
2014/01/20 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
招商银行工作证明
2015/06/17 职场文书
2016新年年会主持词
2015/07/06 职场文书
2016公司新年问候语
2015/11/11 职场文书
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript