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

 2022-10-27    326  

背景

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

前提

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

环境

机器

cat/etc/redhat-release|xargsecho'版本'&&dmidecode-ssystem-product-name|xargsecho'是否虚拟化'&&cat/proc/cpuinfo|grep"processor"|wc-l|xargsecho'cpu核数'
版本CentOSLinuxrelease7.5.1804(Core)
是否虚拟化KVM
cpu核数4

myql5.7.22

5.7.22-log
innodb_buffer_pool_size128M
innodb_log_buffer_size64M
innodb_log_file_size48M
binlog_formatROW
log_binON
transaction_isolationREPEATABLE-READ

mysql8.0.15

8.0.15
innodb_buffer_pool_size128M
innodb_log_buffer_size64M
innodb_log_file_size48M
binlog_formatROW
log_binON
transaction_isolationREPEATABLE-READ

sysbench

sysbench-V
sysbench1.1.0(usingbundledLuaJIT2.1.0-beta3)

测试

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

双1模式下

SHOWGLOBALVARIABLESWHEREVariable_nameIN('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 模式下

SHOWGLOBALVARIABLESWHEREVariable_nameIN('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 禁用预编译语句,不然并发测试线程多时会报下面的错误

FATAL:mysql_stmt_prepare()failed
FATAL:MySQLerror:1461"Can'tcreatemorethanmax_prepared_stmt_countstatements(currentvalue:16382)"
FATAL:mysql_stmt_prepare()failed
FATAL:MySQLerror:1461"Can'tcreatemorethanmax_prepared_stmt_countstatements(currentvalue:16382)"
FATAL:thread_init'functionfailed:/usr/local/share/sysbench/oltp_common.lua:288:SQLAPIerrorFATAL:mysql_stmt_prepare()failedFATAL:MySQLerror:1461"Can'tcreatemorethanmax_prepared_stmt_countstatements(currentvalue:16382)"FATAL:thread_init'functionfailed:/usr/local/share/sysbench/oltp_common.lua:288:SQLAPIerror
FATAL:mysql_stmt_prepare()failed

使用脚本

catsysbench_test_mysql5.7_8.0_tps_qps.sh
#!/bin/bash
#用于sysbench测试在读写模式、只读模式、只写模式下mysql5.7和mysql8.0的tps,qps
#nohupbash$0>/tmp/sysbench_test2>&1&
#
user=admin
passwd=admin
ports="801557222"
host=127.0.0.1
sysbench_test_mode="oltp_read_writeoltp_read_onlyoltp_write_only"
sysbench_test_info_path=/tmp/sysbench-test
functionred_echo(){
localwhat="$*"
echo-e"$(date+%F-%T)\e[1;31m${what}\e[0m"
}
functioncheck_las_comm(){
if[$1-ne0];then
red_echo$2
exit1
fi
}
functionrestart_mysqld(){
servicemysqld${1}restart
sleep2
}
functionpurge_binlog(){
port=$1
mysql-u$user-p$passwd-P$port-h$host<<EOF
purgebinarylogsbeforenow();
EOF
}
functionclean_os_cache(){
echo3>/proc/sys/vm/drop_caches
}
functionsysbench_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
}
functionmain(){
fortest_modein$sysbench_test_mode;do
forportin$ports;do
forthread_numin{5,10,20,30,40,80,120,200};do
restart_mysqld"$port"
check_las_comm"$?""restartmysqld${port}failed"
clean_os_cache
purge_binlog"$port"
red_echo"sysbench$thread_numthreadscleanupmysqld${port}"
sysbench_with_diff_thread"$thread_num""$port""cleanup""$test_mode">/dev/null
red_echo"sysbench$thread_numthreadspreparemysqld${port}"
sysbench_with_diff_thread"$thread_num""$port""prepare""$test_mode">/dev/null
mkdir-p$sysbench_test_info_path
red_echo"sysbench$thread_numthreadsrunmysqld${port}$test_mode"
sysbench_with_diff_thread"$thread_num""$port""run""$test_mode">$sysbench_test_info_path/${test_mode}_${thread_num}_$port
#servicemysqld{port}stop
done
done
done
}
main

  •  标签:  
  • MySQL
  •  

原文链接:https://77isp.com/post/10192.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。