MySQL 5.7と8.0、どちらがパフォーマンスが優れていますか?ネチズンはうるさいです!

  • バックグラウンド

  • 前提

  • 周囲

  • テスト

  • ダブル1モードの場合

  • 02モード

  • 結論として

バックグラウンド

読み取り/書き込み、読み取り専用、および書き込み専用モード(tps、qps)で、異なる同時実行性の下でmysql5.7とmysql8.0のパフォーマンスをテストします。

前提

  • テストバージョンはmysql5.7.22およびmysql8.0.15です。

  • sysbenchテストの前に、mysqlサービスを再起動し、osキャッシュをクリアします(複数のテスト中にキャッシュにヒットしないようにするため)

  • テストが実行されるたびに、mysql5.7およびmysql8.0のテストの前に新しいテストデータが生成されます

  • mysql5.7とmysql8.0の構成パラメーターが各テスト中に一貫していることを確認してください

  • 328ページのMySQLPDFドキュメントを整理しました

周囲

Machine cat / etc / redhat-release | xargs echo'version '&& dmidecode -s system-product-name | xargs echo'仮想化されているかどうか '&& cat / proc / cpuinfo | grep "processor" | wc -l | xargs echo' cpuコアのバージョン数CentOSLinuxリリース7.5.1804(コア)KVMcpuコア番号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)

テスト

  • 異なる永続化戦略(binlog、REDOログ永続性)での読み取り/書き込みモード、読み取り専用モード、および書き込み専用モード(oltp_read_write、oltp_read_only、oltp_write_only)でのmysql5.7およびmysql8.0のパフォーマンス

  • sysbenchのテスト時間は60秒で、テストされるテーブルの数は20です。

  • テストは、デュアル1モード(安全)と0 2モード(高性能)で実行されました。

MySQL 5.7と8.0、どちらがパフォーマンスが優れていますか? ネチズンはうるさいです!

ダブル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のパフォーマンス

MySQL 5.7と8.0、どちらがパフォーマンスが優れていますか? ネチズンはうるさいです!

  • ダブル1構成、読み取り/書き込みモードでは、mysql5.7.22とmysql8.0.15のtpsおよびqpsのパフォーマンスはほぼ同じです。mysql8.0.15に120の同時スレッドがある場合、パフォーマンスは低下します。

読み取り専用モードでのmysql5.7およびmysql8.0のパフォーマンス

MySQL 5.7と8.0、どちらがパフォーマンスが優れていますか? ネチズンはうるさいです!

  • ダブル1構成、読み取り専用モードでは、mysql5.7.22のtpsとqpsはmysql8.0.15よりも約1/3優れています。同時スレッドの数が増加した後、tpsとqpsは増加しませんが、減少傾向を示します。

書き込み専用モードでのmysql5.7およびmysql8.0のパフォーマンス

MySQL 5.7と8.0、どちらがパフォーマンスが優れていますか? ネチズンはうるさいです!

  • 書き込み専用モードでのダブル1構成では、同時実行数が増えるため、mysql5.7.22のパフォーマンスはmysql8.0.15よりも約1/4優れています。

02モード

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のパフォーマンス

MySQL 5.7と8.0、どちらがパフォーマンスが優れていますか? ネチズンはうるさいです!

  • 0 2構成、読み取り/書き込みモードで、同時実行数が少ない場合、mysql5.7.22のパフォーマンスはmysql8.0.15よりも優れています。同時実行数が比較的多い場合、mysql8.0.15のパフォーマンスはmysql5.7.22よりも優れています。同時スレッド数が80を超える場合、パフォーマンスが開始されます。低下

読み取り専用モードでのmysql5.7およびmysql8.0のパフォーマンス

MySQL 5.7と8.0、どちらがパフォーマンスが優れていますか? ネチズンはうるさいです!

  • 0 2構成、読み取り専用モードでは、mysql5.7.22のパフォーマンスはmysql8.0.15よりも約1/3優れています。同時実行数が増えると、パフォーマンスは向上しませんが、低下傾向にあります。

書き込み専用モードでのmysql5.7およびmysql8.0のパフォーマンス

MySQL 5.7と8.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禁用预编译语句、不然到ρ現在の値:16382) "致命的:mysql_stmt_prepare()が失敗しました致命的:MySQLエラー:1461" max_prepared_stmt_countステートメントを超えて作成できません(現在の値:16382) "致命的:thread_init '関数が失敗しました:/ usr / local / share / sysbench / oltp_common.lua:288:SQL APIエラーFATAL:mysql_stmt_prepare()が失敗しましたFATAL:MySQLエラー:1461 "max_prepared_stmt_countステートメント(現在の値:16382)を超えて作成できません" FATAL:thread_init '関数が失敗しました:/ usr / local / share /sysbench/oltp_common.lua:288:SQL APIエラー致命的:mysql_stmt_prepare()が失敗しました

328ページのMySQLPDFドキュメントを整理しました

スクリプトを使用する

 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

おすすめ

転載: blog.51cto.com/14975073/2596527