Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MySQL 5.7 vs 8.0,哪个性能更牛?

MySQL 5.7 vs 8.0,哪个性能更牛?

作者头像
程序猿DD
发布于 2020-11-24 06:20:35
发布于 2020-11-24 06:20:35
1.1K00
代码可运行
举报
文章被收录于专栏:程序猿DD程序猿DD
运行总次数:0
代码可运行

来源:r6d.cn/8cw

背景

测试mysql5.7和mysql8.0分别在读写,选定,只写模式下不同并发时的性能(tps,qps)

最早

  • 测试使用版本为mysql5.7.22和mysql8.0.15
  • sysbench测试前先重启mysql服务,并清除os的缓存(避免多次测试时命中缓存)
  • 每次进行测试都是新生成测试数据后再进行mysql5.7和mysql8.0的测试
  • 每次测试时保证mysql5.7和mysql8.0的配置参数一致

环境

机器cat / etc / redhat-release | xargs echo'版本'&& dmidecode -s系统产品名称| xargs echo'是否虚拟化'&& cat / proc / cpuinfo | grep“ processor” | wc -l | xargs echo'cpu核数'版本CentOS Linux版本7.5.1804(核心)是否虚拟化KVM cpu核数4

myql5.7.22

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
5.7.22-log
innodb_buffer_pool_size 128M
innodb_log_buffer_size  64M
innodb_log_file_size    48M
binlog_format   ROW
log_bin ON
transaction_isolation   REPEATABLE-READ

mysql8.0.15

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
8.0.15
innodb_buffer_pool_size 128M
innodb_log_buffer_size  64M
innodb_log_file_size    48M
binlog_format   ROW
log_bin ON
transaction_isolation   REPEATABLE-READ

系统平台

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sysbench -V
sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3)

测试

  • 在不同的持久化策略下(binlog,重做日志持久化)mysql5.7和mysql8.0在读写模式,引用模式,只写模式(oltp_read_write,oltp_read_only,oltp_write_only)下的性能表现
  • sysbench测试时间为60s,测试的表数量为20
  • 测试分别在双1模式(安全性)和0 2模式(高级)下进行

参数

任选值

意味着

sync_binlog

0

binlog刷盘持久化由操作系统完成,性能好,存在丢失binlog的风险

sync_binlog

1个

事务提交后刷盘持久化,最安全

sync_binlog

ñ

在每N个事务提交后进行刷盘持久化

innodb_flush_log_at_trx_commit

0

每秒钟写redo log并刷盘持久化

innodb_flush_log_at_trx_commit

1个

事务提交后写redo log并刷盘持久化,最安全

innodb_flush_log_at_trx_commit

2

事务提交后写redo log,两次刷盘持久化

双1模式下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SHOW GLOBAL  VARIABLES WHERE Variable_name IN('sync_binlog','innodb_flush_log_at_trx_commit');
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
| sync_binlog                    | 1   |
+--------------------------------+-------+

mysql5.7和mysql8.0在读写模式下的表现

  • 双1配置,读写模式下,mysql5.7.22和mysql8.0.15 tps,qps性能差不多,mysql8.0.15在120线程并发时,性能出现了下降幅度

mysql5.7和mysql8.0在预期模式下的表现

  • 双1配置,预期模式下,mysql5.7.22的tps,qps比mysql8.0.15好1/3左右;并发线程数增加后,tps,qps并没有增加,反而出现了下降的趋势

mysql5.7和mysql8.0在只写模式下的表现

  • 双1配置,只写模式下,转换并发数的上升,mysql5.7.22的性能比mysql8.0.15好1/4左右

0 2模式下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SHOW GLOBAL  VARIABLES WHERE Variable_name IN('sync_binlog','innodb_flush_log_at_trx_commit');
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
| sync_binlog                    | 0   |
+--------------------------------+-------+

mysql5.7和mysql8.0在读写模式下的表现

  • 0 2配置,读写模式下,并发数低时,mysql5.7.22性能好于mysql8.0.15; 并发数比较高时,mysql8.0.15性能好于mysql5.7.22;在80线程的并发以上时,性能开始下降

mysql5.7和mysql8.0在预期模式下的表现

  • 0 2配置,预期模式下,mysql5.7.22性能比mysql8.0.15好1/3左右;转换并发数的上升,性能也没有上升,反而有下降的趋势

mysql5.7和mysql8.0在只写模式下的表现

  • 0 2配置,只写模式下,mysql5.7.22的tps顶点比较大;mysql5.7.22的qps比mysql8.0.15好1/3左右

摘要

  • 整体来看,mysql5.7.22在读写模式,扩展模式,只写模式下的表现是mysql8.0.15的
  • 随着并行数的增加,性能表现不会也跟着增加,将会出现下降
  • 本次测试结果是在配置很低的情况下进行的,不代表绝对

注意sysbench需要设置--db-ps-mode = disable禁用预编译语句,不然并发测试线程多时会报下面的错误。致命:mysql_stmt_prepare()失败致命:MySQL错误:1461“不能创建超过max_prepared_stmt_count语句(当前值:16382)“致命:mysql_stmt_prepare()失败致命:MySQL错误:1461”不能创建超过max_prepared_stmt_count语句(当前值:16382)“致命:thread_init' function failed: /usr/local/share/sysbench/oltp_common.lua:288: SQL API error FATAL: mysql_stmt_prepare() failed FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)" FATAL:thread_init'函数失败:/ usr / local / share / sysbench / oltp_common.lua:288:SQL API错误致命:mysql_stmt_prepare()失败

使用脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 cat sysbench_test_mysql5.7_8.0_tps_qps.sh
#!/bin/bash
#用于sysbench 测试在读写模式、只读模式、只写模式下 mysql5.7和mysql8.0 的tps,qps
#nohup bash $0 >/tmp/sysbench_test 2>& 1 &
#

user=admin
passwd=admin
ports="8015 57222"
host=127.0.0.1
sysbench_test_mode="oltp_read_write oltp_read_only oltp_write_only"
sysbench_test_info_path=/tmp/sysbench-test

function red_echo () {

        local what="$*"
        echo -e "$(date +%F-%T) \e[1;31m ${what} \e[0m"
}

function check_las_comm(){
    if [ $1 -ne 0 ];then
        red_echo $2
        exit 1
    fi
}

function  restart_mysqld(){
  service mysqld${1} restart
  sleep 2
}

function  purge_binlog(){
port=$1
mysql -u$user -p$passwd -P$port -h$host<<EOF
purge binary logs before now();
EOF
}


function clean_os_cache(){
  echo 3 > /proc/sys/vm/drop_caches
}

function  sysbench_with_diff_thread(){


thread_num=$1
port=$2
order=$3
test_mode=$4
sysbench /usr/local/share/sysbench/${test_mode}.lua --mysql_storage_engine=innodb  --table-size=100000 --tables=20 --mysql-db=test_1 --mysql-user=$user --mysql-password=$passwd --mysql-port=$port  --mysql-host=$host --threads=$thread_num  --time=60 --report-interval=2 --db-ps-mode=disable --events=0 --db-driver=mysql $order

}

function  main(){
for test_mode in $sysbench_test_mode;do

  for port in $ports;do
    for thread_num in {5,10,20,30,40,80,120,200};do
      restart_mysqld "$port"
      check_las_comm  "$?" "restart mysqld${port} failed "
      clean_os_cache
      purge_binlog "$port"

      red_echo "sysbench $thread_num  threads cleanup mysqld${port}"
      sysbench_with_diff_thread "$thread_num" "$port" "cleanup" "$test_mode">/dev/null

      red_echo "sysbench $thread_num  threads prepare mysqld${port}"
      sysbench_with_diff_thread "$thread_num" "$port" "prepare" "$test_mode">/dev/null

      mkdir -p $sysbench_test_info_path
      red_echo "sysbench $thread_num  threads run mysqld${port} $test_mode"
      sysbench_with_diff_thread "$thread_num" "$port" "run" "$test_mode" > $sysbench_test_info_path/${test_mode}_${thread_num}_$port

      # service mysqld{port} stop
    done
  done
done

}

main
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿DD 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 5.7 vs 8.0,哪个性能更牛?
测试mysql5.7和mysql8.0 分别在读写、只读、只写模式下不同并发时的性能(tps,qps)
民工哥
2020/11/09
1.6K0
MySQL 5.7 vs 8.0,哪个性能更牛?
MySQL 8.0 information_schema系统库的改进
在表的数量很多时,每次查询I_S会从文件系统中读取每个单独的FRM文件,使用更多的CPU周期来打开表并准备相关的内存数据结构
星哥玩云
2022/08/18
5480
MySQL 8.0 information_schema系统库的改进
MySQL性能基准测试对比:MySQL 5.7与MySQL 8.0
版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于db weekly英文官网,若转载请注明出处。翻译目的在于传递更多全球最新数据库领域相关信息,并不意味着腾讯云数据库产品团队赞同其观点或证实其内容的真实性。如果其他媒体、网站或其他任何形式的法律实体和个人使用,必须经过著作权人合法书面授权并自负全部法律责任。不得擅自使用腾讯云数据库团队的名义进行转载,或盗用腾讯云数据库团队名义发布信息。
腾讯技术工程官方号
2019/03/05
6.8K0
MySQL性能基准测试对比:MySQL 5.7与MySQL 8.0
MySQL 8.0复制性能的提升
MySQL复制从问世到现在已经经历了多个年头,它的稳定性和可靠性也在稳步的提高。这是一个不停进化的过程,由于MySQL的很多重要功能都是依赖于复制,所以复制的快速发展也是很容易理解的。
星哥玩云
2022/08/13
1.1K0
MySQL 8.0复制性能的提升
三款云数据库性能测试,谁表现最好?
MySQL性能压测或者基准测试看起来很简单,使用sysbench,tpcc工具跑跑拿到数据就好,其实压测是一个技术活儿,尤其是涉及到性能对比的测试,因为不同场景/不同厂商的产品的参数设置不同,测试的结果也不一样。如果不阐明具体的参数配置差异,直接给出压测结果可能给其他人带来误导。
用户1278550
2020/04/08
3.3K0
三款云数据库性能测试,谁表现最好?
使用sysbench压力测试MySQL(一)(r11笔记第3天)
今天用了下新版本的sysbench,发现和早期版本的差别还不小,确实有不少有趣的地方,是的,我们继续测试下MySQL。 如果大家看过《高性能MySQL》这本书,就会发现里面对于基准测试的描述非常全面和专业,里面的测试场景都是基于早期版本,这个版本有一个不太方便的地方就是无法抓取到更细节的数据,只有平均值,所以要不需要定制脚本,要不就需要更多的测试场景和时间来得到一个报告。 sysbench目前最新的版本是1.0.3,里面的interval参数确实很赞,也是驱动我尝试的最大动力,因为能够得
jeanron100
2018/03/21
2.2K0
使用sysbench压力测试MySQL(一)(r11笔记第3天)
使用sysbench压力测试MySQL(二)
昨天有了第一篇的测试之后,仅仅是一个开始。 我接下来做sysbench压测的主要思路是根据现有的配置作出调整,能够持续性的优化和压力测试达到目的,而不是简单的去对比连接数在不同数量级会有多大的差别,所以你会在里面看到一些问题的排查,一些问题的解决,可能有些又不是压测相关的。 压测连接数300跑不上去 我设置了max_connections为3000,但是压测的时候到了300个线程就跑不上去了。这个问题很有典型性。 sysbench抛出的错误如下: FATAL: mysql_stmt_prep
jeanron100
2018/03/21
3.8K0
使用sysbench压力测试MySQL(二)
MySQL常见配置参数及命令
wait_timeout:客户端连接自动断开连接时间(默认值是28800s,8个小时),自动断开的操作是“Server层的连接器做的”,断开后需要重新连接;
向着百万年薪努力的小赵
2022/12/02
8380
GreatSQL vs MySQL性能测试来了,速围观~
https://www.bilibili.com/video/BV1Da411W7Va
GreatSQL社区
2023/02/23
8260
MySQL 8.0复制新特性
截止2017年8月,MySQL 8.0 仍然是 beta 版本,复制功能有一些很棒的改进。最初,这些改进是为组复制(GR)开发的,但由于 GR 在底层使用常规复制,所以传统的 MySQL 复制也能由此获益。
wubx
2019/02/27
9560
使用sysbench压力测试MySQL(三)(r12笔记第6天)
昨天使用gdb调试MySQL中事务临界状态的时候,发现其实有些场景可能比我想得还要复杂一些,所以我在昨天的测试中结尾也是快快扫过,但是表明了意思即可。这一点上我在后面会把Oracle的临界事务状态也拿出来对比一下,还是蛮有意思的。 今天简单写了几个脚本继续对一个测试环境的MySQL进行sysbench压力测试。 先突破1000连接资源设置的瓶颈 在上一次的基础上,我们保证了能够满足短时间内1000个连接的冲击,从各个方面做了调整,其中的一个重点逐渐落到了IO的吞吐率上,redo日志的大小
jeanron100
2018/03/21
2.7K0
使用sysbench压力测试MySQL(三)(r12笔记第6天)
技术分享 | MariaDB 10.1.9 迁移到 MySQL 5.7.25
爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查,对数据库有兴趣,对技术有想法。一入 IT 深似海,从此节操是路人。
爱可生开源社区
2020/06/12
2.1K0
技术分享 | MariaDB 10.1.9 迁移到 MySQL 5.7.25
MySQL8.0.19 禁用Binlog,保留副本上的提交顺序
MySQL 8.0.19引入了无Binlog副本(保留事务提交顺序),这意味着用户可以在不启用二进制日志的情况下部署异步副本,并保留相同的顺序提交事务。用户可以禁用Binlog(skip-log-bin)和回放线程产生的日志(log-slave-updates = FALSE)进行的更改,同时保留相同提交顺序(slave-preserve-commit-order = TRUE)。
MySQLSE
2020/09/28
1.5K0
MySQL8.0.19 禁用Binlog,保留副本上的提交顺序
MySQL5.7安装步骤
本次进行MySQL5.7版本的安装,关于MySQL版本选择、官网下载地址、相关系统配置等操作可以参照之前的博文,本文就不在赘述咯。可以参考历史文章处理,下面直奔主题,进行相关安装工作。
俊才
2019/08/08
1.1K0
MySQL5.7安装步骤
技术分享 | 无损半同步复制下,主从高可用切换后数据一致吗?
MySQL5.7 默认参数下我们开启了半同步,在一个事务提交(commit) 的过程时,在 MySQL 层的 write binlog 步骤后,Master 节点需要收到至少一个 Slave 节点回复的 ACK (表示收到了binlog )后,才能继续下一个事务;
爱可生开源社区
2022/08/25
7440
Mac下MySQL的my.cnf配置文件在哪
无论是homebrew等方式,在Mac下都是不会生成my.cnf文件,因为已经使用了最优默认值,如果需要也可以自行新建或配置/etc/my.cnf
JaneYork
2023/10/11
2.7K0
Mac下MySQL的my.cnf配置文件在哪
Mysql并行复制实践总结
一般Mysql主从复制有三个线程参与,都是单线程:Binlog Dump(主) -> IO Thread (从) -> SQL Thread(从)。
mingjie
2022/05/12
1.4K0
Mysql并行复制实践总结
【Mysql】mysql 基于GTID复制
3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
用户5522200
2019/06/02
1.8K0
MySQL 性能:使用 MySQL 5.7 实现每秒 50 万查询
使用UNIX socket来运行Point-Selects测试的Sysbench命令如下(在parallel中启动8个进程):
zhangdd
2018/08/01
7020
MySQL 8.0 需要调整哪些参数
首先列出一个 8.0 my.cnf 的实例,这个只针对普通的单实例或者主从环境,对于其他环境,比如 MGR,可能有更多的一些参数需要调整。并且也不是最完整,最终要根据自己实际环境进行调整。
数据库交流
2022/06/15
1.8K0
推荐阅读
相关推荐
MySQL 5.7 vs 8.0,哪个性能更牛?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验