当前位置: 首页 > 科技观察

最新版MySQL8.0与5.7性能对比

时间:2023-03-23 10:53:44 科技观察

简介在OracleMySQL团队的推动下,MySQL8.0发生了翻天覆地的变化和修改。物理文件已更改。例如,*.frm、*.TRG、*.TRN和*.par不再存在。增加了大量的新特性,例如CommonTableExpressionsCTE、WindowFunctions、InvisibleIndexes和正则表达式(regexp)——MySQL8.0现在完全支持Unicode,并且具有多字节安全特性。数据字典也发生了变化。它现在与事务数据字典合并,后者存储有关数据库对象的信息。与以前的版本不同,字典数据存储在元数据文件和非事务表中。安全性得到提升,caching_sha2_password认证方式取代之前的mysql_native_password认证方式成为默认认证方式。它提供了更大的灵活性,但也加强了安全性,即它需要使用支持通过RSA密钥对交换密码的安全连接或未加密链接。本文不讨论它的新特性,而是将它的性能与MySQL5.7进行比较,看看它有何改进。服务器搭建及环境本次基准测试,我打算使用基于AWSEC2最低配置的系统环境:实例类型:t2.xlarge实例存储:gp2(SSD存储,最低100IOPS,最高16000IOPS)虚拟CPU:4内存:16GiBMySQL5.7版本:MySQLCommunityServer(GPL)5.7.24MySQL8.0版本:MySQLCommunityServer-GPL8.0.14在这个benchmark测试中,我还配置了一些参数项的值,分别是:innodb_max_dirty_pages_pct=90##这是MySQL8.0中的默认值。innodb_max_dirty_pages_pct_lwm=10##这是MySQL8.0中的默认值innodb_flush_neighbors=0innodb_buffer_pool_instances=8innodb_buffer_pool_size=8GiB这里两个版本(MySQL5.7和MySQL8.0)剩余参数的配置参考my.cnf优化ClusterControl的模板。另外,我这里没有使用MySQL8.0新的认证方式,即caching_sha2_password认证方式。替代方案是两个版本都使用mysql_native_password,加上configureinnodb_dedicated_serve=OFF(默认值),因为innodb_dedicated_serve是MySQL8.0的新特性。为了简化工作,我使用ClusterControl配置MySQL5.7社区版节点,然后将该节点从集群中移除,使其成为一个独立的主机,并关闭集群控制主机,使MySQL5.7节点处于一个休眠状态(无流量监控)。从技术上讲,MySQL5.7和MySQL8.0都是休眠节点,上面没有活动连接,所以它基本上是一个纯粹的基准测试。使用的命令和脚本对于此任务,sysbench用于环境、测试和负载模拟。下面测试中使用的命令和脚本:sb-prepare.sh#!/bin/bashhost=$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_modepreparesb-run.sh#!/usr/bin/envbash2host=$1port=3306user="sysbench"password="MysqP@55w0rd"table_size=100000tables=10rate=20ps_mode='disable'threads=1events=0time=5trx=100path=$PWDcounter=1echo"thread,cpu">${host}-cpu.csvforiin16326412825651210242048;dothreads=$imysql-h$host-e"SHOWGLOBALSTATUS">>$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=我的ql--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$host-sysbench.logecho"${i},"`cat${tmpfile}|sort-nr|head-1`>>${host}-cpu.csvunlink${tmpfile}mysql-h$host-e"SHOWGLOBALSTATUS">>$host-global-status。logdonepython$path/innodb-ops-parser.py$hostmysql-h$host-e"SHOWGLOBALVARIABLES">>$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行操作。当线程数增加时,MySQL8.0明显优于MySQL5.7!两个版本都没有对配置项进行个性化改动,只有我统一配置的参数项。所以两个版本中的配置几乎都使用默认值。有趣的是,MySQL团队关于新版本读写性能的声明,这些图表表明性能有了显着提高,尤其是在负载很重的服务器上。想想MySQL5.7和MySQL8.0在InnoDB行操作上的区别,确实有很大的区别,尤其是线程数增加的时候。MySQL8.0表明无论工作负载如何,它都能高效运行。事务处理如上图所示,MySQL8.0结果趋势显示处理事务所需的时间发生了巨大变化。纵轴上的值越低,性能越好,这意味着事务处理速度越快。TransactionsProcessedStatistics表(第二个表)也显示两个版本之间处理的交易数量没有差异。这意味着两个版本处理的交易数量几乎相同,但它们以不同的速度完成。虽然MySQL5.7可以在较低负载下处理大量事务,但实际负载,尤其是在生产中,可能会更高——尤其是在最繁忙的时期。CPU资源在这个基准测试中,我决定测试一些硬件资源,尤其是CPU利用率。让我首先解释如何在基准测试中获取CPU使用率。在对数据库进行基准测试时,sysbench测试结果不包括过程中使用的硬件资源的统计信息。所以我所做的是通过创建一个文件来创建身份,SSH到目标主机,然后使用Linux命令“top”收集数据并在测试结束时解析它,然后再次收集。然后分析占用CPU使用率最大的mysqld进程,最后删除标识文件。你可以在github上查看我的代码。我们再讨论一下图表结果,似乎表明MySQL8.0对CPU的消耗很大,比MySQL5.7还要多。但是,MySQL8.0可能需要在新的变量配置上消耗额外的CPU。例如,这些变量可能会影响您的MySQL8.0:innodb_log_spin_cpu_abs_lwm=80innodb_log_spin_cpu_pct_hwm=50innodb_log_wait_for_flush_spin_hwm=400innodb_parallel_read_threads=4具有默认值的变量将在该基准测试中保留其默认值。由于MySQL8.0重新设计了InnoDB写入REDO日志的方式(这是一个改进),前三个变量配置用于处理重做日志的CPU资源。例如,变量innodb_log_spin_cpu_pct_hwm具有CPU亲和性,这意味着如果mysqld只绑定4个核心,它将忽略其他CPU核心。对于并行读取线程,MySQL8.0中添加了一个新变量,允许您调整要使用的线程数。结论MySQL8.0有很多改进。基准测试结果表明,与MySQL5.7相比,MySQL8.0不仅在处理读取负载时,而且在读写混合的高负载下也取得了不俗的表现。纵观MySQL8.0的新特性,它似乎不仅利用了最新的软件技术(例如Memcached改进、远程管理以获得更好的DevOps工作性能等),而且还利用了硬件。例如,将latin1替换为UTF8MB4作为默认字符编码。这意味着它需要更多的磁盘空间,因为UTF8在非US-ASCII字符上需要2个字节。虽然此基准测试没有利用使用caching_sha2_password的新身份验证方法,但无论是否使用加密都不会影响性能。一旦通过身份验证,它就会存储在缓存中,这意味着身份验证只进行一次。所以如果你在客户端只使用一个用户,是没有问题的,而且比以前的版本更安全。总的来说,MySQL8.0的性能已经远超MySQL5.7。

最新推荐
猜你喜欢