2台のRaspberryPi4に入れたMySQL8.0.20とMySQL5.7.31に対してsysbenchで速度比較をしてみたい。

今回参考にさせていただいたのは以下の記事です。ありがとうございます。

MySQL5.7と8.0でシンプルにベンチマークを比較してみる - Qiita

環境や条件は以下となります。

  1. 比較対象:MySQL8.0.20とMySQL5.7.31
  2. 2台のラズパイはRaspberryPi4 4GB、Raspbian Buster
  3. 使用するベンチマークソフト:sysbench
  4. レコード件数:100万件
  5. パラメータ:基本初期値のまま

上記5が特に曲者なのですが、とりあえずinnodb_buffer_pool_size見ると、MySQLの両方のバージョンで128MBでした。

$ mysqladmin -uroot -p[MySQLのrootのパスワード] variables | grep innodb_buffer_pool_size
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
| innodb_buffer_pool_size                                  | 134217728          

他のパラメーターは…う~ん、まぁいっか。

1.sysbench計測準備

ラズパイ上でsysbench最新版をインストールする方法は前回記事を参考にしてください。

MySQL8.0と5.7速度比較の為に、ラズパイ上でSysbenchコンパイル : DevLife

以下のSQLで両方のMySQLにデータベースとユーザーを作成。

CREATE DATABASE sbtestdb;
CREATE USER sbtestuser@localhost IDENTIFIED BY 'Password!';
GRANT ALL PRIVILEGES ON sbtestdb.* to sbtestuser@localhost;

以下のコマンドで100万件を作成。

sysbench --db-driver=mysql \
--mysql-host=localhost \
--mysql-user=sbtestuser \
--mysql-password='Password!' \
--mysql-db=sbtestdb \
--table_size=1000000 \
--mysql-socket=/usr/local/mysql/data/mysql.sock \
oltp_read_write \
prepare

ちなみに。

以前100万件バルクインサート実行したときと同様、MySQL8.0は数分で終わったのに対して、MySQL5.7のほうは30分以上かかりました。

ちょっとおかしい。なので、調べる。

ストレージ(SDカード)の書き込み速度調査

疑わしきはSDカード。

MySQLのデータディレクトリに対して1GBのファイルを5回writeして速度測ってみたくて、こんなシェルを作ってみた。

start_time=`date +%s`
max=5
for ((i=0; i < $max; i++)); do
        echo "**********"
        echo `expr $i + 1`回目書込
        echo "**********"
        time sudo dd if=/dev/zero of=/usr/local/mysql/data/test_hdwrite.tmp ibs=1M obs=1M count=1024
done
end_time=`date +%s`
ss=`expr ${end_time} - ${start_time}`
hh=`expr ${ss} / 3600`
ss=`expr ${ss} % 3600`
mm=`expr ${ss} / 60`
ss=`expr ${ss} % 60`
echo "********************"
echo "Total time = ${hh}:${mm}:${ss}"
echo "********************"

結果は以下。


MySQL5.7 Disk性能 MySQL8.0 Disk性能

書込時間(s) 書込速度(MB/s) 書込時間(s) 書込速度(MB/s)
1回目 79.7989 13.5 26.4813 40.5
2回目 72.5314 14.8 28.1249 38.2
3回目 70.0347 15.3 26.5251 40.5
4回目 73.3175 14.6 26.7778 40.1
5回目 72.6854 14.8 26.4169 40.6
合計 368.3679 73 134.326 199.9
平均 73.67358 14.6 26.8652 39.98

ビンゴ。

SDカードによっては書込速度にこれほどの差があるとは思っていなかったです。

性能の悪いSDカード・・・よりも性能の良いSDカードを紹介したほうが良いよね。

つ~わけで以下のSDカードを急遽用意して、Win32DiskImagerってソフトで現行SDカード上のRaspbianのイメージバックアップ&新しいSDカードに対してリストアを実施。

これで同じSDカードで2台のラズパイ、片方はMySQL5.7、もう片方はMySQL8.0の用意が完了。

2.ベンチマーク開始

参考にしたサイトと同様に測定してみる。

但し、innodb_buffer_pool_size=128MB。

あと試行回数は3回。

測定(30秒間でのトランザクション数)

oltp_read_only

sysbench --db-driver=mysql \
--mysql-host=localhost \
--mysql-user=sbtestuser \
--mysql-password='Password!' \
--mysql-db=sbtestdb \
--mysql-socket=/usr/local/mysql/data/mysql.sock \
--time=30 \
--threads=1 \
oltp_read_only \
run

MySQL5.7 MySQL8.0
1回目 4,852(161.70 per sec.) 4,192(139.70 per sec.)
2回目 4,873(162.40 per sec.) 4,155(138.90 per sec.)
3回目 4,831(161.01 per sec.) 4,309(143.63 per sec.)

ん?

oltp_write_only

sysbench --db-driver=mysql \
--mysql-host=localhost \
--mysql-user=sbtestuser \
--mysql-password='Password!' \
--mysql-db=sbtestdb \
--mysql-socket=/usr/local/mysql/data/mysql.sock \
--time=30 \
--threads=1 \
oltp_write_only \
run

MySQL5.7 MySQL8.0
1回目 7,543(251.42 per sec.) 2,290(76.32 per sec.)
2回目 7,460(248.29 per sec.) 2,230(74.31 per sec.)
3回目 7,124(237.44 per sec.) 2,261(75.34 per sec.)

はぁ?

oltp_read_write

sysbench --db-driver=mysql \
--mysql-host=localhost \
--mysql-user=sbtestuser \
--mysql-password='Password!' \
--mysql-db=sbtestdb \
--mysql-socket=/usr/local/mysql/data/mysql.sock \
--time=30 \
--threads=1 \
oltp_read_write \
run

MySQL5.7 MySQL8.0
1回目 2,302(76.71 per sec.) 1,511(50.36 per sec.)
2回目 2,317(77.23 per sec.) 1,516(50.53 per sec.)
3回目 2,366(78.86 per sec.) 1,463(48.76 per sec.)

マジか。。。

3.考察

これはMySQLのバージョンアップの宿命なのか?

バージョンアップするたびにスループット性能、悪くなってませんかね?

Readに関しては、わずかにMySQL5.7に軍配が上がったわけだけど、Writeに関してはMySQL5.7の圧勝。

MySQL8.0良いとこ無し、です。

一瞬、SDカード以外にも2台のラズパイで何か差異があるのか疑ったけれど、MySQLのパラメータ以外は同じ状況です。

Google先生に聞いてみても、一般的にベンチマークテストではMySQL8.0よりもMySQL5.7のほうが高速という結果を記載しているブログなどが多く、正直びっくりでした。

というわけで、まだMySQL8.0は使用せずに5.7を使っておこう。オー!

・・・とは、そろそろいかない。

というのも、MySQLのサポート期限がバージョンごとに以下のように定義されているからだ。

リリース GA日 Premier Support 期限 Extended Support 期限
MySQL Database 5.7 2015年10月 2020年10月 2023年10月
MySQL Database 8.0 2018年4月 2023年4月 2026年4月

これを見るに、5.7→8.0にバージョンアップするタイミングと、システムによっては改修要否を検討の上、もう着手タイミングをそろそろ調整しなければいけないと思うんだ。

となると、今度はMySQL8.0のクセを見抜いて、以下にスループット性能を向上させるかを追求しなきゃいかん。

と、そういう時期に入ってきた、そんな気がする。

4.まとめ

  • スループット性能は未だMySQL5.7のほうが上
  • 特にWrite性能に差がある
  • でもサポート期限の関係でそろそろMySQL8.0の使用を検討する時期か?
  • MySQL8.0のスループット性能向上のTipsを今後まとめていきたい

てな感じです。

今日は以上!



【今日の音楽】
ヨアソビ
収録アルバム: 夜に駆ける