MySQL和MariaDB單例項壓測對比
阿新 • • 發佈:2021-12-24
根據 MariaDB 官網的文章 https://mariadb.com/resources/blog/benchmark-mariadb-vs-mysql-on-commodity-cloud-hardware/ 修改而來。
本次壓測使用預設的 docker 容器,未經任何配置。
先將本次使用的壓測指令碼放出來:
#!/bin/bash # set -eux is_exists=0 command -v sysbench >/dev/null 2>&1 || { is_exists=1; } if [ $is_exists -ne 0 ]; then echo 'sysbench 命令不存在,安裝 sysbench' source /etc/os-release if [ $ID == 'arch' ]; then sudo pacman -Syy sudo pacman -S sysbench --noconfirm elif [ $ID == 'ubuntu' || $ID == 'debian' ]; then sudo apt update sudo apt install -y sysbench else echo '未知發行版' exit 1 fi echo 'sysbench 已安裝' fi # 輸入認證資訊 # read -p 'MySQL host: ' mysql_host # read -p 'MySQL port: ' mysql_port # read -p 'MariaDB host: ' mariadb_host # read -p 'MariaDB port: ' mariadb_port # read -p 'user: ' user # read -p 'password: ' password # 認證資訊輸入完畢 mysql_ctn='mysql_bench' mariadb_ctn='mariadb_bench' mysql_port=33061 mariadb_port=33062 password=123456 # 測試前刪除重名測試容器 docker rm $mysql_ctn -f docker rm $mariadb_ctn -f # 建立 bench 容器 docker run -itd --name $mysql_ctn -p $mysql_port:3306 -e MYSQL_ROOT_PASSWORD=$password mysql docker run -itd --name $mariadb_ctn -p $mariadb_port:3306 -e MARIADB_ROOT_PASSWORD=$password mariadb host=172.17.0.1 # 建立後休息 10 秒等容器完全啟動 sleep 10 echo '建立 bench 資料庫' docker exec -it $mysql_ctn mysql -uroot -p$password -e 'CREATE DATABASE sysbench' docker exec -it $mariadb_ctn mariadb -uroot -p$password -e 'CREATE DATABASE sysbench' echo '資料庫已建立' echo '準備資料' sysbench oltp_read_write --mysql-host=$host --mysql-port=$mysql_port --mysql-user=root --mysql-password=$password --mysql-db=sysbench --table-size=1000000 --tables=10 --threads=16 --auto-inc=off --secondary=off --create_secondary=off prepare sleep 3 sysbench oltp_read_write --mysql-host=$host --mysql-port=$mariadb_port --mysql-user=root --mysql-password=$password --mysql-db=sysbench --table-size=1000000 --tables=10 --threads=16 --auto-inc=off --secondary=off --create_secondary=off prepare # 壓測 BASEDIR="$HOME/sysbench" if [ ! -d $BASEDIR ]; then mkdir -p $BASEDIR fi cd $BASEDIR rm -rf $BASEDIR/logs* exec 3>&1 4>&2 1>> sysbench.log 2>&1 # 8, 16, 32, 64, 128 THERAD_NUMBER="8 64 128" round=0 # 跑 10 輪測試 while [ $round -le 10 ]; do round_dir=$BASEDIR/logs-${round} mkdir -p ${round_dir} for thread in `echo "${THERAD_NUMBER}"`; do sysbench oltp_read_write --point-selects=9 --range-selects=false --index-updates=0 --non-index-updates=1 --delete-inserts=0 --time=300 --tables=10 --table-size=1000000 --rand-type=uniform --report-interval=10 --mysql-db=sysbench --mysql-host=$host --mysql-port=$mysql_port --mysql-user=root --mysql-password=$password --threads=$thread --rand-seed=12341 run >> ${round_dir}/sysbench_mysql_${thread}.log sysbench oltp_read_write --point-selects=9 --range-selects=false --index-updates=0 --non-index-updates=1 --delete-inserts=0 --time=300 --tables=10 --table-size=1000000 --rand-type=uniform --report-interval=10 --mysql-db=sysbench --mysql-host=$host --mysql-port=$mariadb_port --mysql-user=root --mysql-password=$password --threads=$thread --rand-seed=12341 run >> ${round_dir}/sysbench_mariadb_${thread}.log # 不同執行緒之間休息 5 分鐘 sleep 300 done round=`expr $round + 1` # 每輪壓縮之間停頓 5 分鐘 sleep 300 done # 刪除測試容器 docker rm $mysql_ctn -f docker rm $mariadb_ctn -f
下面是本次壓測用到的 MySQL 和 MariaDB 版本資訊:
mariadb Ver 15.1 Distrib 10.6.5-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
mysql Ver 8.0.27 for Linux on x86_64 (MySQL Community Server - GPL)
下面是本機配置資訊:
OS: Arch Linux x86_64 Kernel: 5.15.10-arch1-1 CPU: Intel i7-9700 (8) @ 4.700GHz Memory: 6378MiB / 15662MiB
準備資料(命令已包含在上面的指令碼中):
sysbench oltp_read_write --mysql-host=localhost --mysql-user=root --mysql-password=123456 --mysql-db=sysbench --table-size=1000000 --tables=10 --threads=10 --auto-inc=off --secondary=off --create_secondary=off prepare
壓測(命令已包含在上面的指令碼中):
sysbench oltp_read_write --point-selects=9 --range-selects=false --index-updates=0 --non-index-updates=1 --delete-inserts=0 --time=300 --tables=10 --table-size=1000000 --rand-type=uniform --report-interval=10 --mysql-db=sysbench --mysql-host=localhost --mysql-user=root --mysql-password=123456 --threads=16 --rand-seed=12341 run
100W 條資料分別以 8、64、128 執行緒壓測 10 輪,得到的結果有些出人意料,我並沒有看到網上所傳的 MariaDB 效能比 MySQL 高,不論是 TPS 還是延遲,MySQL 都輾壓 MariaDB。
當然,受於硬體限制,本次壓測與官網中的壓測條件不能相提並論,TPS 很難達到官網中的那麼高。
各執行緒 10 輪 TPS 結果
10 輪最終結果的 TPS 和延遲彙總
結論
從上面的圖表能夠看出來,MySQL 輾壓 MariaDB 沒毛病吧?
我還是老老實實地用 MySQL 吧。