Maison  >  Article  >  base de données  >  MySQL 5.7 vs 8.0, performances PK

MySQL 5.7 vs 8.0, performances PK

coldplay.xixi
coldplay.xixiavant
2020-11-02 17:36:252978parcourir

La colonne

tutoriel mysql présente la comparaison des performances entre MySQL 5.7 et MySQL 8.0.

MySQL 5.7 vs 8.0, performances PK

Contexte

Tester les performances de mysql5.7 et mysql8.0 dans différentes conditions de concurrence en lecture-écriture, en lecture seule et modes en écriture seule. (tps, qps)

Prérequis

  • La version de test est mysql5.7.22 et mysql8.0.15
  • Redémarrez le service mysql avant les tests sysbench. , et videz le cache du système d'exploitation (pour éviter d'atteindre le cache lors de plusieurs tests)
  • Chaque fois qu'un test est effectué, de nouvelles données de test sont générées avant de tester mysql5.7 et mysql8.0
  • Mysql5 est garanti lors de chaque test Les paramètres de configuration de .7 et mysql8.0 sont cohérents

Environnement

Machine

cat /etc/redhat-release | xargs echo '版本 ' && dmidecode -s system-product-name | xargs echo '是否虚拟化 ' && cat /proc/cpuinfo |grep "processor"|wc -l | xargs echo 'cpu核数 ' 
版本 CentOS Linux release 7.5.1804 (Core)  
是否虚拟化 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

sysbench -V
sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3)复制代码

Test

  • Sous différentes stratégies de persistance (binlog, persistance du journal redo) mysql5.7 et mysql8.0 lisent et écrivent Performances en mode, mode lecture seule, mode écriture seule (oltp_read_write, oltp_read_only, oltp_write_only)

  • le temps de test sysbench est de 60 s et le nombre de tables testées est de 20

  • Les tests ont été réalisés en mode double 1 (sécurité) et en mode 0 2 (haute performance)

  • MySQL 5.7 vs 8.0, performances PK

    AFFICHER LES VARIABLES GLOBALES OÙ Nom_variable IN('sync_binlog','innodb_flush_log_at_trx_commit'); +--------------------------------+-------+ Nom_variable | Valeur | +--------------------------------+-------+ | innodb_flush_log_at_trx_commit | | sync_binlog | +--------------------------------+------+

Performances de mysql5.7 et mysql8.0 en mode lecture-écriture

MySQL 5.7 vs 8.0, performances PK

  • Configuration Double 1, en mode lecture-écriture, mysql5. 7.22 Les performances de tps et qps de mysql8.0.15 sont similaires lorsque mysql8.0.15 a 120 threads simultanément, les performances chutent et tremblent :

Performances de mysql5.7 et mysql8.0 en lecture. mode uniquement

MySQL 5.7 vs 8.0, performances PK

  • Configuration Double 1, en mode lecture seule, les tps et qps de mysql5.7.22 sont environ 1/3 meilleurs que ceux de mysql8. 0,15 ; le nombre de threads simultanés augmente. Par la suite, les tps et les qps n'ont pas augmenté, mais ont montré une tendance à la baisse.

Performances de mysql5.7 et mysql8.0 en mode écriture seule

MySQL 5.7 vs 8.0, performances PK

  • Configuration Double 1, écriture- uniquement en mode, à mesure que le nombre de concurrence augmente, les performances de mysql5.7.22 sont environ 1/4 meilleures que celles de mysql8.0.15.

Mode 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   |
+--------------------------------+-------+复制代码

Performances de mysql5.7 et mysql8.0 en mode lecture et écriture

MySQL 5.7 vs 8.0, performances PK

  • Configuration 0 2, en mode lecture-écriture, lorsque le nombre de concurrence est faible, les performances de mysql5.7.22 sont meilleures que celles de mysql8.0.15 lorsque le nombre de concurrence est relativement élevé, les performances de mysql8 ; .0.15 est meilleur que celui de mysql5.7.22 ; dans la concurrence de 80 threads. Au-dessus, les performances commencent à se dégrader.

Performances de mysql5.7 et mysql8.0 en mode lecture seule

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

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

MySQL 5.7 vs 8.0, performances PK

  • 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: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"
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' 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' function failed: /usr/local/share/sysbench/oltp_common.lua:288: SQL API error
FATAL: mysql_stmt_prepare() failed复制代码

使用脚本

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 /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复制代码

更多相关免费学习推荐:mysql教程(视频)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer