使用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使用cookie库操保存cookie详解
Mar 03 Python
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
python uuid模块使用实例
Apr 08 Python
Python实现的计数排序算法示例
Nov 29 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
python绘制无向图度分布曲线示例
Nov 22 Python
python实现高斯判别分析算法的例子
Dec 09 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
python中字典增加和删除使用方法
Sep 30 Python
Python项目实战之使用Django框架实现支付宝付款功能
Feb 23 Python
Python机器学习之KNN近邻算法
May 14 Python
利用Python实时获取steam特惠游戏数据
Jun 25 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
关于手调机和数调机的选择
2021/03/02 无线电
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
JavaScript小技巧 2.5 则
2010/09/12 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
Python将图片转换为字符画的方法
2020/06/16 Python
Python贪心算法实例小结
2018/04/22 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
什么是python的列表推导式
2020/05/26 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
德国苹果商店:MacTrade
2020/05/18 全球购物
自我推荐书
2013/12/04 职场文书
公务员培的训心得体会
2014/09/01 职场文书
2015新学期开学寄语
2015/02/26 职场文书
保险内勤岗位职责
2015/04/13 职场文书
环保守法证明
2015/06/24 职场文书
个人收入证明格式
2015/06/24 职场文书
解除租赁合同协议书
2016/03/21 职场文书
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android
深入理解Pytorch微调torchvision模型
2021/11/11 Python
正则表达式拆分url实例代码
2022/02/24 Java/Android