使用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 28 Python
python中的全局变量用法分析
Jun 09 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
Python callable()函数用法实例分析
Mar 17 Python
Python删除n行后的其他行方法
Jan 28 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
Python TCP通信客户端服务端代码实例
Nov 21 Python
详解Python中的分支和循环结构
Feb 11 Python
Pycharm中import torch报错的快速解决方法
Mar 05 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 身份证号验证函数
2009/05/07 PHP
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
vue mvvm数据响应实现
2020/11/11 Javascript
zbar解码二维码和条形码示例
2014/02/07 Python
python里对list中的整数求平均并排序
2014/09/12 Python
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
Python3中的bytes和str类型详解
2019/05/02 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
django页面跳转问题及注意事项
2019/07/18 Python
解决python 文本过滤和清理问题
2019/08/28 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
P/Invoke是什么
2015/07/31 面试题
情侣吵架检讨书
2014/02/05 职场文书
高中毕业自我评价
2014/02/08 职场文书
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
专题组织生活会方案
2014/06/15 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript