1. 程式人生 > 其它 >MySQL和MariaDB單例項壓測對比

MySQL和MariaDB單例項壓測對比

根據 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 吧。