社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL 5.7 & MySQL 8.0 性能对比

IT牧场 • 4 年前 • 502 次点击  

点击上方 IT牧场 ,选择 置顶或者星标

技术干货每日送达


来源:cnblogs.com/YangJiaXin/p/11234591.html

  • 背景
  • 最早
  • 环境
  • 测试
    • 双1模式下
    • 0 2模式下
  • 摘要

背景

测试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

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

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

系统平台

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_binlog0binlog刷盘持久化由操作系统完成,性能好,存在丢失binlog的风险
sync_binlog1个事务提交后刷盘持久化,最安全
sync_binlogñ在每N个事务提交后进行刷盘持久化
innodb_flush_log_at_trx_commit0 每秒钟写redo log并刷盘持久化
innodb_flush_log_at_trx_commit1个事务提交后写redo log并刷盘持久化,最安全
innodb_flush_log_at_trx_commit2事务提交后写redo log,两次刷盘持久化

双1模式下

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模式下

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()失败

使用脚本

 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

干货分享

最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!

001:《Java并发与高并发解决方案》学习笔记;002:《深入JVM内核——原理、诊断与优化》学习笔记;003:《Java面试宝典》004:《Docker开源书》005:《Kubernetes开源书》006:《DDD速成(领域驱动设计速成)》007:全部008:加技术群讨论

近期热文

LinkedBlockingQueue vs ConcurrentLinkedQueue解读Java 8 中为并发而生的 ConcurrentHashMapRedis性能监控指标汇总最全的DevOps工具集合,再也不怕选型了!微服务架构下,解决数据库跨库查询的一些思路聊聊大厂面试官必问的 MySQL 锁机制

关注我

喜欢就点个"在看"呗^_^

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/74867
 
502 次点击