
基准测试
-
2023年3月3日发(作者:路边的野花不要采简谱)mysql5.7事务性能_MySQL性能基准测试对⽐:MySQL5.7与
MySQL8.0
版权声明:本⽂由腾讯云数据库产品团队整理,页⾯原始内容来⾃于dbweekly英⽂官⽹,若转载请注明出处。翻译⽬的在于传递更多全球
最新数据库领域相关信息,并不意味着腾讯云数据库产品团队赞同其观点或证实其内容的真实性。如果其他媒体、⽹站或其他任何形式的法
律实体和个⼈使⽤,必须经过著作权⼈合法书⾯授权并⾃负全部法律责任。不得擅⾃使⽤腾讯云数据库团队的名义进⾏转载,或盗⽤腾讯云
数据库团队名义发布信息。
在OracleMySQL团队的推动下,MySQL8.0发⽣了巨⼤的变化和修改。
物理⽂件已更改。例如,*.frm,*.TRG,*.TRN和*.par不再存在。添加了⼤量的新特性,如通⽤表表达式(CommonTableExpressions
CTE),窗⼝函数(WindowFunctions),不可见索引(InvisibleIndexes),正则表达式(regexp)-MySQL8.0现在已经完全⽀持
Unicode,且具有多字节安全特性。数据字典也发⽣了变化。它现在与⼀个事务性数据字典合并,该字典存储有关数据库对象的信息。与以
前的版本不同,字典数据存储在元数据⽂件和⾮事务表中。
安全性得到了改进,caching_sha2_password认证⽅式取代了之前的mysql_native_password认证⽅式,成为默认的⾝份验证⽅式。它
提供了更强⼤的灵活性,⽽且也加强了安全性,即它要求必须使⽤安全连接或通过RSA密钥对实现的⽀持密码交换的未加密链接。
有了MySQL8.0提供的所有这些很出⾊的功能,以及进⾏的增强和改进,我们团队很有兴趣来了解下MySQL8.0当前版本的性能情况。特
别是考虑到我们针对MySQL8.0.x设计的ClusterControl正在进⾏中(请继续保持关注)。这篇博⽂不会讨论MySQL8.0的特性,但打算将
其性能与MySQL5.7进⾏对⽐,看看它是如何改进的。
ServerSetupandEnvironment服务器设置和环境
对于此基准测试,我打算使⽤基于AWSEC2最⼩配置的系统环境:
·实例类型:实例
·存储:gp2(SSD存储,最⼩100IOPS,最⼤16000IOPS)
·虚拟CPU:4
·内存:16GiB
·MySQL5.7版本:MySQLCommunityServer(GPL)5.7.24
·MySQL8.0版本:MySQLCommunityServer-GPL8.0.14
在这个基准测试中,我也针对⼀些参数项的取值进⾏了配置,它们是:
·innodb_max_dirty_pages_pct=90##这是MySQL8.0中的默认值。
·innodb_max_dirty_pages_pct_lwm=10##这是MySQL8.0中的默认值
·innodb_flush_neighbors=0
·innodb_buffer_pool_instances=8
·innodb_buffer_pool_size=8GiB
这⾥对两个版本(MySQL5.7和MySQL8.0)其余参数项的配置是参照ClusterControl的模板进⾏调优。
此外,我在这⾥不使⽤MySQL8.0的新⾝份验证⽅式,即caching_sha2_password认证⽅式。替代的是在这两个版本中都使⽤
mysql_native_password,外加配置innodb_dedicated_serve=OFF(默认值),因为innodb_dedicated_serve是MySQL8.0的新特
性。
为了简化⼯作,我使⽤ClusterControl配置MySQL5.7Communityversion节点,然后把该节点从集群中的剔除,使其成为⼀个单独主
机,并关闭集群控制主机,使MySQL5.7节点处于休眠状态(不监控流量)。从技术上讲,MySQL5.7和MySQL8.0都是休眠节点,在节点
上没有活动连接通,因此它基本上是⼀个纯粹的基准测试。
CommandsandScriptsUsed使⽤的命令和脚本
对于此任务,sysbench⽤于测试和负载模拟这两个环境。以下测试中使⽤的命令和脚本:
#!/bin/bash
host=$1#host192.168.10.110port=3306user='sysbench'password='MysqP@55w0rd'table_size=500000rate=20ps_mode='d
-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
#!/usr/bin/envbash2
host=$1port=3306user="sysbench"password="MysqP@55w0rd"table_size=100000tables=10rate=20ps_mode='disable'threa
counter=1
echo"thread,cpu">${host}-
foriin651210242048;
do
threads=$i
mysql-h$host-e"SHOWGLOBALSTATUS">>$file=$path/${host}-
tmp${threads}touch$tmpfile/bin/$tmpfile$host$threads&
/usr/share/sysbench/oltp_read_--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=allrun|tee-a$
echo"${i},"`cat${tmpfile}|sort-nr|head-1`>>${host}-
unlink${tmpfile}
mysql-h$host-e"SHOWGLOBALSTATUS">>$
done
python$path/$host
mysql-h$host-e"SHOWGLOBALVARIABLES">>$
因此,脚本只是准备sbtestschema并填充表和记录。然后,它使⽤
/usr/share/sysbench/oltp_read_脚本执⾏读/写负载测试。该脚本转储全局状态和MySQL变量,收集CPU利⽤率,并解析由
脚本处理的InnoDB⾏操作。脚本根据基准测试期间收集的转储⽇志⽣成*.csv⽂件,我在这⾥使⽤Excel电⼦表格
从*.csv⽂件⽣成图表。请检查github中提交的代码。
现在,让我们继续处理图表结果!
InnoDB⾏操作
基本上在这⾥,我只提取了InnoDB⾏操作,它执⾏查找(读取),删除,插⼊和更新。当线程数量增加时,MySQL8.0明显优于MySQL
5.7!在这两个版本中都没有针对配置项进⾏任何个性化变更,只有我统⼀配置的参数项。所以这两个版本中的配置⼏乎都使⽤默认值。
有趣的是,MySQL团队关于新版本中读写性能的声明,这些图表指出了性能的显著提⾼,特别是在⾼负载服务器上。想⼀下MySQL5.7和
MySQL8.0在InnoDB⾏操作上的区别,确实存在有很⼤的不同,特别是当线程数增加的时候。MySQL8.0表明,⽆论⼯作负载如何,它
都能⾼效地运⾏。
事务处理
如上图所⽰,MySQL8.0的结果趋势显⽰出其处理事务所需的时间的巨⼤变化。纵轴数值越低,代表性能越好,意味着处理事务的速度更
快。处理的事务统计表(第⼆张表)还显⽰出这两个版本处理事务的数量没有差异。这意味着,两个版本处理的事务数量⼏乎相同,但它们的
完成速度不同。虽然MySQL5.7在较低的负载下可以⼤量事务,但是实际的负载,特别是在⽣产中,可能会更⾼——尤其是在最繁忙的时
期。
上⾯的图仍然显⽰的是两个版本能够处理的事务数量,只是将读和写分离开来。然⽽,图中实际上是存在异常值,⽽我没有将这些值包括在
内,因为它们是这⼀⼩部分异常结果会扭曲图形。
MySQL8.0体现出⼀个很⼤的改进,特别是对于读取。表现在写操作的效率上,特别是对于⾼⼯作负载的服务器。在8.0版本中,影响
MySQL读取性能的重要新增⽀持是:可以按降序(或正向索引扫描)创建索引的能⼒。以前的版本只有升序或反向索引扫描,如果需要降
序,MySQL必须执⾏filesort(如果需要filesort,需要检查max_length_for_sort_data的值)。当最有效的扫描顺序混合某些列的升序和其
他列的降序时,降序索引还使优化器可以使⽤多列索引。有关详细信息,请参见此处。
CPU资源
在此基准测试中,我决定测试⼀些硬件资源,尤其是CPU利⽤率。
让我先解释⼀下如何在基准测试中获取CPU使⽤率。在对数据库进⾏基准测试时,sysbench测试结果中不包括在此过程中使⽤的硬件资源
的统计信息。因此,我所做的是通过创建⽂件的⽅式来创建标识,通过SSH连接到⽬标主机,然后⽤Linux命令“top”收集数据并在测试
结束前进⾏解析,然后再次收集。然后分析出mysqld进程占⽤最⼤的CPU使⽤量,最后删除该标识⽂件。你可以查看我在github上的代
码。
让我们再次讨论图表结果,似乎表明MySQL8.0消耗了⼤量的CPU,超过MySQL5.7。然⽽,MySQL8.0可能必须消耗额外的CPU在新
的变量配置上。例如,这些变量可能会影响您的MySQL8.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
在此基准测试中,具有默认值的变量将保留其默认值。由于MySQL8.0重新设计了InnoDB写⼊REDO⽇志的⽅式(这是⼀个改进),前三个
变量可配置处理重做⽇志的使⽤的CPU资源。例如,变量innodb_log_spin_cpu_pct_hwm具有CPU亲和性,这意味着如果mysqld仅绑定
到4个内核,它将忽略其他CPU内核。对于并⾏读取线程,在MySQL8.0中添加了⼀个新变量,您可以调整要使⽤的线程数。
然⽽,我没有深⼊研究这个问题。可以通过利⽤MySQL8.0提供的特性来提⾼性能。
结论
MySQL8.0中有许多改进。基准测试结果显⽰,与MySQL5.7相⽐,MySQL8.0不仅在处理读负载时,⽽且在读写混合的⾼负载下的性
能都取得了令⼈瞩⽬的进步。
再来看MySQL8.0的新特性,看起来它不仅利⽤了最新的软件技术(如Memcached的改进,远程管理以获得更好的DevOps⼯作性能等),
还有硬件。例如,⽤UTF8MB4替换latin1作为默认字符编码。这意味着它需要更多的磁盘空间,因为UTF8在⾮US-ASCII字符上需要2个
字节。虽然此基准测试没有利⽤使⽤caching_sha2_password的新⾝份验证⽅法,但它是否使⽤加密不会影响性能。⼀旦经过⾝份验证,
它就会存储在缓存中,这意味着⾝份验证只进⾏⼀次。因此,如果您在客户端只使⽤⼀个⽤户,则不会出现问题,并且⽐以前的版本更安
全。
由于MySQL利⽤最新的硬件和软件,因此会更改其默认变量。你可以在这⾥阅读更多细节。
总的来说,MySQL8.0的性能已经远超过MySQL5.7了。