点小蓝字加关注!

版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于severalnines英文官网,若转载请注明出处。翻译目的在于传递更多全球最新数据库领域相关信息,并不意味着腾讯云数据库产品团队赞同其观点或证实其内容的真实性。如果其他媒体、网站或其他任何形式的法律实体和个人使用,必须经过著作权人合法书面授权并自负全部法律责任。不得擅自使用腾讯云数据库团队的名义进行转载,或盗用腾讯云数据库团队名义发布信息。

原文链接:https://severalnines.com/blog/mysql-performance-benchmarking-mysql-57-vs-mysql-80


在Oracle MySQL团队的推动下,MySQL 8.0发生了巨大的变化和修改。

物理文件已更改。例如,*.frm,* .TRG,*.TRN和* .par 不再存在。添加了大量的新特性,如通用表表达式(Common Table Expressions CTE),窗口函数(Window Functions),不可见索引( Invisible Indexes),正则表达式(regexp) -MySQL8.0现在已经完全支持Unicode,且具有多字节安全特性。数据字典也发生了变化。它现在与一个事务性数据字典合并,该字典存储有关数据库对象的信息。与以前的版本不同,字典数据存储在元数据文件和非事务表中。

安全性得到了改进,caching_sha2_password认证方式取代了之前的mysql_native_password认证方式,成为默认的身份验证方式。它提供了更强大的灵活性,而且也加强了安全性,即它要求必须使用安全连接或通过RSA密钥对实现的支持密码交换的未加密链接。

有了MySQL 8.0提供的所有这些很出色的功能,以及进行的增强和改进,我们团队很有兴趣来了解下MySQL 8.0当前版本的性能情况。特别是考虑到我们针对MySQL 8.0.x设计的ClusterControl正在进行中(请继续保持关注)。这篇博文不会讨论MySQL8.0的特性,但打算将其性能与MySQL 5.7进行对比,看看它是如何改进的。

Server Setup and Environment服务器设置和环境

对于此基准测试,我打算使用基于AWS EC2最小配置的系统环境:

·      实例类型:t2.xlarge实例

·      存储:gp2(SSD存储,最小100 IOPS,最大16000 IOPS)

·      虚拟CPU:4

·      内存:16GiB

·      MySQL5.7版本:MySQLCommunity Server (GPL) 5.7.24

·      MySQL8.0版本:MySQLCommunity Server - GPL 8.0.14

在这个基准测试中,我也针对一些参数项的取值进行了配置,它们是:

·      innodb_max_dirty_pages_pct= 90 ##这是MySQL 8.0中的默认值。

·      innodb_max_dirty_pages_pct_lwm= 10 ##这是MySQL 8.0中的默认值

·      innodb_flush_neighbors=0

·      innodb_buffer_pool_instances=8

·      innodb_buffer_pool_size=8GiB

这里对两个版本(MySQL 5.7和MySQL 8.0)其余参数项的配置是参照ClusterControl的my.cnf模板进行调优。

此外,我在这里不使用MySQL8.0的新身份验证方式,即caching_sha2_password认证方式。替代的是在这两个版本中都使用mysql_native_password,外加配置innodb_dedicated_serve=OFF(默认值),因为innodb_dedicated_serve是MySQL 8.0的新特性。

为了简化工作,我使用ClusterControl配置MySQL 5.7 Community version节点,然后把该节点从集群中的剔除,使其成为一个单独主机,并关闭集群控制主机,使MySQL 5.7节点处于休眠状态(不监控流量)。从技术上讲,MySQL 5.7和MySQL8.0都是休眠节点,在节点上没有活动连接通,因此它基本上是一个纯粹的基准测试。

搜索关注“腾讯云数据库”官方微信,立得10元腾讯云无门槛代金券,体验移动端一键管理数据库,更有从初阶到高阶数据库实战教程等你来约!

Commands and Scripts Used使用的命令和脚本

对于此任务,sysbench用于测试和负载模拟这两个环境。以下测试中使用的命令和脚本:

sb-prepare.sh #!/bin/bash host=$1#host192.168.10.110port=3306user='sysbench'password='MysqP@55w0rd'table_size=500000rate=20ps_mode='disable'sysbench/usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --threads=1--max-requests=0 --time=3600 --mysql-host=$host --mysql-user=$user--mysql-password=$password --mysql-port=$port --tables=10 --report-interval=1--skip-trx=on --table-size=$table_size --rate=$rate --db-ps-mode=$ps_modeprepare

sb-run.sh

#!/usr/bin/envbash2     host=$1port=3306user="sysbench"password="MysqP@55w0rd"table_size=100000tables=10rate=20ps_mode='disable'threads=1events=0time=5trx=100path=$PWD  counter=1   echo "thread,cpu" >${host}-cpu.csv   for i in 16 32 64 128 256 512 1024 2048; do  threads=$i  mysql -h $host -e"SHOW GLOBAL STATUS" >> $host-global-status.logtmpfile=$path/${host}-tmp${threads}touch $tmpfile/bin/bashcpu-checker.sh $tmpfile $host $threads &  /usr/share/sysbench/oltp_read_write.lua--db-driver=mysql --events=$events --threads=$threads --time=$time--mysql-host=$host --mysql-user=$user --mysql-password=$password--mysql-port=$port --report-interval=1 --skip-trx=on --tables=$tables--table-size=$table_size --rate=$rate --delete_inserts=$trx --order_ranges=$trx--range_selects=on --range-size=$trx --simple_ranges=$trx --db-ps-mode=$ps_mode--mysql-ignore-errors=all run | tee -a $host-sysbench.log   echo"${i},"`cat ${tmpfile} | sort -nr | head -1` >> ${host}-cpu.csvunlink ${tmpfile}   mysql -h $host -e"SHOW GLOBAL STATUS" >> $host-global-status.logdone   python $path/innodb-ops-parser.py $host  mysql -h $host -e "SHOW GLOBALVARIABLES" >> $host-global-vars.log

因此,脚本只是准备sbtestschema并填充表和记录。然后,它使用

/usr/share/sysbench/oltp_read_write.lua脚本执行读/写负载测试。该脚本转储全局状态和MySQL变量,收集CPU利用率,并解析由脚本innodb-ops-parser.py处理的InnoDB行操作。脚本根据基准测试期间收集的转储日志生成* .csv文件,我在这里使用Excel电子表格从* .csv文件生成图表。请检查 github中提交的代码。

现在,让我们继续处理图表结果!

InnoDB行操作

基本上在这里,我只提取了InnoDB行操作,它执行查找(读取),删除,插入和更新。当线程数量增加时,MySQL 8.0明显优于MySQL 5.7!在这两个版本中都没有针对配置项进行任何个性化变更,只有我统一配置的参数项。所以这两个版本中的配置几乎都使用默认值。

有趣的是,MySQL团队关于新版本中读写性能的声明,这些图表指出了性能的显著提高,特别是在高负载服务器上。想一下MySQL 5.7和MySQL 8.0在InnoDB行操作上的区别,确实存在有很大的不同,特别是当线程数增加的时候。MySQL 8.0表明,无论工作负载如何,它都能高效地运行。

事务处理

如上图所示,MySQL 8.0的结果趋势显示出其处理事务所需的时间的巨大变化。纵轴数值越低,代表性能越好,意味着处理事务的速度更快。处理的事务统计表(第二张表)还显示出这两个版本处理事务的数量没有差异。这意味着,两个版本处理的事务数量几乎相同,但它们的完成速度不同。虽然MySQL 5.7在较低的负载下可以大量事务,但是实际的负载,特别是在生产中,可能会更高——尤其是在最繁忙的时期。

上面的图仍然显示的是两个版本能够处理的事务数量,只是将读和写分离开来。然而,图中实际上是存在异常值,而我没有将这些值包括在内,因为它们是这一小部分异常结果会扭曲图形。

MySQL 8.0体现出一个很大的改进,特别是对于读取。表现在写操作的效率上,特别是对于高工作负载的服务器。在8.0版本中,影响MySQL读取性能的重要新增支持是:可以按降序(或正向索引扫描)创建索引的能力。以前的版本只有升序或反向索引扫描,如果需要降序,MySQL必须执行filesort(如果需要filesort,需要检查max_length_for_sort_data的值)。当最有效的扫描顺序混合某些列的升序和其他列的降序时,降序索引还使优化器可以使用多列索引。有关详细信息,请参见此处。

CPU资源

在此基准测试中,我决定测试一些硬件资源,尤其是CPU利用率。

让我先解释一下如何在基准测试中获取CPU使用率。在对数据库进行基准测试时,sysbench测试结果中不包括在此过程中使用的硬件资源的统计信息。因此,我所做的是通过创建文件的方式来创建标识,通过SSH连接到目标主机,然后用Linux命令“top”收集数据并在测试结束前进行解析,然后再次收集。然后分析出mysqld进程占用最大的CPU使用量,最后删除该标识文件。你可以查看我在github上的代码。

让我们再次讨论图表结果,似乎表明MySQL 8.0消耗了大量的CPU,超过MySQL 5.7。然而,MySQL 8.0可能必须消耗额外的CPU在新的变量配置上。例如,这些变量可能会影响您的MySQL 8.0:

·      innodb_log_spin_cpu_abs_lwm = 80

·      innodb_log_spin_cpu_pct_hwm = 50

·      innodb_log_wait_for_flush_spin_hwm = 400

·      innodb_parallel_read_threads = 4

在此基准测试中,具有默认值的变量将保留其默认值。由于MySQL 8.0重新设计了InnoDB写入REDO日志的方式(这是一个改进),前三个变量可配置处理重做日志的使用的CPU资源。例如,变量innodb_log_spin_cpu_pct_hwm具有CPU亲和性,这意味着如果mysqld仅绑定到4个内核,它将忽略其他CPU内核。对于并行读取线程,在MySQL 8.0中添加了一个新变量,您可以调整要使用的线程数。

然而,我没有深入研究这个问题。可以通过利用MySQL8.0提供的特性来提高性能。

结论

MySQL 8.0中有许多改进。基准测试结果显示,与MySQL 5.7相比,MySQL 8.0不仅在处理读负载时,而且在读写混合的高负载下的性能都取得了令人瞩目的进步。搜索关注“腾讯云数据库”官方微信,立得10元腾讯云无门槛代金券,体验移动端一键管理数据库,更有从初阶到高阶数据库实战教程等你来约!

再来看MySQL 8.0的新特性,看起来它不仅利用了最新的软件技术(如Memcached的改进,远程管理以获得更好的DevOps工作性能等),还有硬件。例如,用UTF8MB4替换latin1作为默认字符编码。这意味着它需要更多的磁盘空间,因为UTF8在非US-ASCII字符上需要2个字节。虽然此基准测试没有利用使用caching_sha2_password的新身份验证方法,但它是否使用加密不会影响性能。一旦经过身份验证,它就会存储在缓存中,这意味着身份验证只进行一次。因此,如果您在客户端只使用一个用户,则不会出现问题,并且比以前的版本更安全。

由于MySQL利用最新的硬件和软件,因此会更改其默认变量。你可以在这里细节。

总的来说,MySQL 8.0的性能已经远超过MySQL 5.7了。

你一定还想看

《了解数据库分片(Database Sharding)》

《图数据库项目DGraph的前世今生》

羊毛速薅

腾讯云数据库新春采购秒杀低至1折

↓↓点这儿秒一折数据库

好文!给你“好看”

mysql 5.7和8.0区别_前沿观察 | MySQL性能基准测试对比:5.7 VS 8.0相关推荐

  1. mysql更改加密方式后密码错误_关于解决mysql 8.0及以上 修改加密方式以及密码

    如果密码已经忘记 或者修改过加密方式后出现密码错误 不用卸载mysql 直接将解压后的mysql文件都删除 ,并将压缩包重新解压再此文件夹中 然后重新安装mysql Windows 上安装 MySQL ...

  2. 关于mysql叙述中错误的是什么_以下关于MySQL的叙述中,错误的是(1.0分)_学小易找答案...

    [单选题]学生表tb_student包含学号sno.学生姓名sname.性别sex.年龄age.所在院系dept.籍贯native等字段,其中age为整型,其余字段均为字符型.现插入一条计算机学院学生 ...

  3. mysql中如何设置主键一直从0开始_怎么让mysql的id从0开始

    满意答案 有时候我们在测试网站的时候,删除测试数据导致id不是从0开始,那如果想id是从0开始怎么办呢? mysql默认自增ID是从1开始了,但当我们如果有插入表或使用delete删除id之后ID就会 ...

  4. vue 3.0和2.0区别_一文看懂 Vue.js 3.0 的优化

    Vue.js 从 1.x 到 2.0 版本,最大的升级就是引入了虚拟 DOM 的概念,它为后续做服务端渲染以及跨端框架 Weex 提供了基础. Vue.js 2.x 发展了很久,现在周边的生态设施都已 ...

  5. mysql的集群和分布式区别_集群和分布式的区别

    简单概括: 集群:多个人在一起做同样的事 . 分布式 :多个人在一起做不同的事 . 负载均衡:决定将任务以某种规则分给谁做. 详细分析 (1)分布式是指多个系统协同合作完成一个特定任务的系统. 分布式 ...

  6. mysql和虚拟主机区别_什么是mysql虚拟主机?mysql虚拟主机有哪些优势?

    什么是mysql虚拟主机?mysql虚拟主机有哪些优势? 分类 虚拟主机帮助 阅读2414 次 发布日期 2018-12-24 目前很多客户的网站都会使用mysql数据库,因为操作简单易于维护,所以m ...

  7. mysql锁机制为何设计如此复杂_再谈mysql锁机制及原理—锁的诠释

    加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...

  8. MySQL性能基准测试对比:MySQL 5.7与MySQL 8.0

    版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于db weekly英文官网,若转载请注明出处.翻译目的在于传递更多全球最新数据库领域相关信息,并不意味着腾讯云数据库产品团队赞同其观点或证实 ...

  9. mysql 压力测试知乎_MySQL性能基准测试对比:MySQL 5.7与MySQL 8.0

    版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于db weekly英文官网,若转载请注明出处.翻译目的在于传递更多全球最新数据库领域相关信息,并不意味着腾讯云数据库产品团队赞同其观点或证实 ...

最新文章

  1. Centos6 升级glibc-2.17,解决Requires: libc.so.6(GLIBC_2.14)(64bit)错误解决方法
  2. VK1629A 驱动芯片
  3. 中国涂料树脂行业投资盈利预测及发展规模展望报告2021-2027年版
  4. Eclipse中启动tomcat报错:A child container failed during start
  5. » Markdown/reST 编辑器 ReText 3.0 发布 Wow! Ubuntu
  6. mysql 上级组织参数值_MySQL参数group_replication_consistency说明
  7. linux中的改变bin级别,Linux常用命令
  8. c++ windows 蓝牙库_c++ - “是否有一个多操作系统蓝牙库?”后续:QT Linux到Windows 10蓝牙 - 堆栈内存溢出...
  9. no response after clicking clone in github desktop
  10. 用Python爬取淘宝2000款套套
  11. signal、kill、fork
  12. TCP/UDP数据包最大传输MTU
  13. elas源码赏析(二)sobel算子3*3行列分解快速卷积
  14. qt 设置按钮大小_QT使用教程(四)之初体验
  15. PCB Layout总结
  16. 网页设计作业-HTML5+CSS大作业——端午节日(25页) 图片滚动
  17. 为什么电子计算机奏出美妙的交响,《延安,我把你追寻》教学设计
  18. 解决safari里面淘宝京东页面无法打开以及打开后乱码的问题!
  19. Processing入门简介
  20. 赠书!《R语言数据分析与可视化从入门到精通》

热门文章

  1. Git根据commitId查看提交内容:根据commitId查看某次提交的内容
  2. Swoole同步/异步/阻塞/非阻塞的理解
  3. java输入hello_详解JAVA输出Hello World
  4. 比较全面的MySQL优化参考
  5. java soap 头_如何将java头添加到java中的soaprequest
  6. docker快速搭建RabbitMQ集群
  7. 在c语言中什么意思,\c在C语言中是什么意思?
  8. 并发测试mysql_实践100个线程:一次MySQL数据并发问题
  9. jQuery 重置/reset()表单
  10. putty 中文乱码