1. MySQL 5.7 vs 8.0,哪個(gè)性能更牛?

        共 4685字,需瀏覽 10分鐘

         ·

        2020-11-18 03:54

        點(diǎn)擊上方藍(lán)色“程序猿DD”,選擇“設(shè)為星標(biāo)”

        回復(fù)“資源”獲取獨(dú)家整理的學(xué)習(xí)資料!

        來源:r6d.cn/8cw


        背景


        測試mysql5.7和mysql8.0分別在讀寫,選定,只寫模式下不同并發(fā)時(shí)的性能(tps,qps)

        最早

        • 測試使用版本為mysql5.7.22和mysql8.0.15
        • sysbench測試前先重啟mysql服務(wù),并清除os的緩存(避免多次測試時(shí)命中緩存)
        • 每次進(jìn)行測試都是新生成測試數(shù)據(jù)后再進(jìn)行mysql5.7和mysql8.0的測試
        • 每次測試時(shí)保證mysql5.7和mysql8.0的配置參數(shù)一致

        環(huán)境

        機(jī)器cat / etc / redhat-release | xargs echo'版本'&& dmidecode -s系統(tǒng)產(chǎn)品名稱| xargs echo'是否虛擬化'&& cat / proc / cpuinfo | grep“ processor” | wc -l | xargs echo'cpu核數(shù)'版本CentOS Linux版本7.5.1804(核心)是否虛擬化KVM cpu核數(shù)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

        系統(tǒng)平臺(tái)

        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)下的性能表現(xiàn)
        • sysbench測試時(shí)間為60s,測試的表數(shù)量為20
        • 測試分別在雙1模式(安全性)和0 2模式(高級(jí))下進(jìn)行
        參數(shù)任選值意味著
        sync_binlog0binlog刷盤持久化由操作系統(tǒng)完成,性能好,存在丟失binlog的風(fēng)險(xiǎn)
        sync_binlog1個(gè)事務(wù)提交后刷盤持久化,最安全
        sync_binlog?在每N個(gè)事務(wù)提交后進(jìn)行刷盤持久化
        innodb_flush_log_at_trx_commit0每秒鐘寫redo log并刷盤持久化
        innodb_flush_log_at_trx_commit1個(gè)事務(wù)提交后寫redo log并刷盤持久化,最安全
        innodb_flush_log_at_trx_commit2事務(wù)提交后寫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在讀寫模式下的表現(xiàn)

        • 雙1配置,讀寫模式下,mysql5.7.22和mysql8.0.15 tps,qps性能差不多,mysql8.0.15在120線程并發(fā)時(shí),性能出現(xiàn)了下降幅度

        mysql5.7和mysql8.0在預(yù)期模式下的表現(xiàn)

        • 雙1配置,預(yù)期模式下,mysql5.7.22的tps,qps比mysql8.0.15好1/3左右;并發(fā)線程數(shù)增加后,tps,qps并沒有增加,反而出現(xiàn)了下降的趨勢

        mysql5.7和mysql8.0在只寫模式下的表現(xiàn)

        • 雙1配置,只寫模式下,轉(zhuǎn)換并發(fā)數(shù)的上升,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在讀寫模式下的表現(xiàn)

        • 0 2配置,讀寫模式下,并發(fā)數(shù)低時(shí),mysql5.7.22性能好于mysql8.0.15; 并發(fā)數(shù)比較高時(shí),mysql8.0.15性能好于mysql5.7.22;在80線程的并發(fā)以上時(shí),性能開始下降

        mysql5.7和mysql8.0在預(yù)期模式下的表現(xiàn)

        • 0 2配置,預(yù)期模式下,mysql5.7.22性能比mysql8.0.15好1/3左右;轉(zhuǎn)換并發(fā)數(shù)的上升,性能也沒有上升,反而有下降的趨勢

        mysql5.7和mysql8.0在只寫模式下的表現(xiàn)

        • 0 2配置,只寫模式下,mysql5.7.22的tps頂點(diǎn)比較大;mysql5.7.22的qps比mysql8.0.15好1/3左右

        摘要

        • 整體來看,mysql5.7.22在讀寫模式,擴(kuò)展模式,只寫模式下的表現(xiàn)是mysql8.0.15的
        • 隨著并行數(shù)的增加,性能表現(xiàn)不會(huì)也跟著增加,將會(huì)出現(xiàn)下降
        • 本次測試結(jié)果是在配置很低的情況下進(jìn)行的,不代表絕對(duì)

        注意sysbench需要設(shè)置--db-ps-mode = disable禁用預(yù)編譯語句,不然并發(fā)測試線程多時(shí)會(huì)報(bào)下面的錯(cuò)誤。致命:mysql_stmt_prepare()失敗致命:MySQL錯(cuò)誤:1461“不能創(chuàng)建超過max_prepared_stmt_count語句(當(dāng)前值:16382)“致命:mysql_stmt_prepare()失敗致命:MySQL錯(cuò)誤:1461”不能創(chuàng)建超過max_prepared_stmt_count語句(當(dāng)前值: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'函數(shù)失?。? usr / local / share / sysbench / oltp_common.lua:288:SQL API錯(cuò)誤致命: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


        DD自研的滬牌代拍業(yè)務(wù),點(diǎn)擊直達(dá)


        往期推薦

        因退休太無聊,Python創(chuàng)始人加入微軟!

        HikariCP為什么自己造了一個(gè)FastList?

        Spring Boot 2.4.0 正式發(fā)布!擁抱云原生!

        服務(wù)網(wǎng)格仍然很難

        10道棘手的Java面試題,看看你能答對(duì)幾個(gè)?

        如果MySQL磁盤滿了,會(huì)發(fā)生什么?


        掃一掃,關(guān)注我

        一起學(xué)習(xí),一起進(jìn)步

        每周贈(zèng)書,福利不斷

        深度內(nèi)容

        推薦加入



        瀏覽 30
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 粗了大了 整进去好爽视频 | 电梯里小妖精真紧高h | 大香蕉大香蕉视频网 | 成年人在线观看 | 国产强 暴 疼 哭 处 女 五月天色婷婷亚洲麻豆 |