简述
在 Oracle MySQL 团队的推动下, MySQL 8.0 发生了巨大的变化和修改.
物理文件已更改. 例如,*.frm,* .TRG,*.TRN 和 * .par 不再存在. 添加了大量的新特性, 如通用表表达式(Common Table Expressions CTE), 窗口函数(Windows Functions), 不可见索引( Invisible Indexes), 正则表达式(regexp) -MySQL8.0 现在已经完全支持 Unicode, 且具有多字节安全特性. 数据字典也发生了变化. 它现在与一个事务性数据字典合并, 该字典存储有关数据库对象的信息. 与以前的版本不同, 字典数据存储在元数据文件和非事务表中.
安全性得到了改进, caching_sha2_password 认证方式取代了之前的 mysql_native_password 认证方式, 成为默认的身份验证方式. 它提供了更强大的灵活性, 而且也加强了安全性, 即它要求必须使用安全连接或通过 RSA 密钥对实现的支持密码交换的未加密链接.
本篇暂不讨论其新特性, 而是将其性能与 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 都是休眠节点, 在节点上没有活动连接通, 因此它基本上是一个纯粹的基准测试.
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.CSV
- unlink ${tmpfile}
- MySQL -h $host -e"SHOW GLOBAL STATUS" >> $host-global-status.log
- done
- 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 行操作
让我们再次讨论图表结果, 似乎表明 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 中添加了一个新变量, 您可以调整要使用的线程数.
结论
MySQL 8.0 中有许多改进. 基准测试结果显示, 与 MySQL 5.7 相比, MySQL 8.0 不仅在处理读负载时, 而且在读写混合的高负载下的性能都取得了令人瞩目的进步.
再来看 MySQL 8.0 的新特性, 看起来它不仅利用了最新的软件技术(如 Memcached 的改进, 远程管理以获得更好的 DevOps 工作性能等), 还有硬件. 例如, 用 UTF8MB4 替换 latin1 作为默认字符编码. 这意味着它需要更多的磁盘空间, 因为 UTF8 在非 US-ASCII 字符上需要 2 个字节. 虽然此基准测试没有利用使用 caching_sha2_password 的新身份验证方法, 但它是否使用加密不会影响性能. 一旦经过身份验证, 它就会存储在缓存中, 这意味着身份验证只进行一次. 因此, 如果您在客户端只使用一个用户, 则不会出现问题, 并且比以前的版本更安全.
来源: http://database.51cto.com/art/201909/603450.htm