Amazon RDS MySQL5.6/MySQL5.7/MySQL8.0 ベンチマーク比較
最近は MySQL8.0 へのアップグレードを目論んでいます。公式では、5.7よりも2倍高速と発表しており、ベンチマークを取って比較してみようと思いました。
前提条件
● AZ、RDSのインスタンスサイズ(t2.medium)、ベンチマーク実行サーバは同じ
● オプショングループ、パラメータグループには若干の差あり
● ベンチマークツールは sysbench を使用
ベンチマーク準備
ベンチマーク実行サーバ(EC2 - AmazonLinux)に sysbench をインストールします。
$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
$ sudo yum install -y install sysbench
sysbench のインストールが完了したらベンチマーク用のデータベースを準備します。ここでは各バージョンの RDS は起動していることを前提に進めます。まずはデータベースの作成からです。
mysql> create database benchtest;
作成したデータベースにテーブルとデータの追加をしていきます。こちらはベンチマーク実行サーバで行います。
$ sysbench --db-driver=mysql --mysql-user=USER_NAME --mysql-password=PASSWORD --mysql-host=HOST_NAME --mysql-db=benchtest oltp_read_write prepare
特に何も指定しなければ、1テーブル・1万行のデータが入ります。さっそくsysbench を動かしてみます。
ベンチマーク実行
結果もセットで記載します。まずは5.6から。
$ sysbench --db-driver=mysql --mysql-user=USER_NAME --mysql-password=PASSWORD --mysql-host=HOST_NAME --mysql-db=benchtest oltp_read_write run
SQL statistics:
queries performed:
read: 7728
write: 2208
other: 1104
total: 11040
transactions: 552 (55.15 per sec.)
queries: 11040 (1103.00 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 10.0071s
total number of events: 552
Latency (ms):
min: 12.40
avg: 18.12
max: 157.21
95th percentile: 58.92
sum: 10004.26
Threads fairness:
events (avg/stddev): 552.0000/0.00
execution time (avg/stddev): 10.0043/0.00
続いて、5.7。
SQL statistics:
queries performed:
read: 7882
write: 2252
other: 1126
total: 11260
transactions: 563 (56.23 per sec.)
queries: 11260 (1124.68 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 10.0098s
total number of events: 563
Latency (ms):
min: 11.33
avg: 17.77
max: 109.16
95th percentile: 44.98
sum: 10006.68
Threads fairness:
events (avg/stddev): 563.0000/0.00
execution time (avg/stddev): 10.0067/0.00
最後に 8.0。
SQL statistics:
queries performed:
read: 10178
write: 2908
other: 1454
total: 14540
transactions: 727 (72.67 per sec.)
queries: 14540 (1453.44 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 10.0019s
total number of events: 727
Latency (ms):
min: 10.11
avg: 13.75
max: 30.25
95th percentile: 17.01
sum: 9997.71
Threads fairness:
events (avg/stddev): 727.0000/0.00
execution time (avg/stddev): 9.9977/0.00
デフォルトでの sysbench 実行では MySQL5.6 / MySQL5.7 では目立った差は出ませんでしたが、MySQL8.0 はその他2つのバージョンに比べて抜けている結果となりました。
もう少しデータ量を増やして実行してみるとどういう結果になるのか気になったので次は以下の条件で実行してみることに。
● 10テーブル
● 各テーブル10万行のデータ
● 同時接続数は10
● 10分間の sysbench 実行(時間を長くしたほうが結果が安定するため)
一度データベースを削除して作り直します。その後、上記環境を作るために以下のコマンドを実行。
$ sysbench --db-driver=mysql --mysql-user=USER_NAME --mysql-password=PASSWORD --mysql-host=HOST_NAME --mysql-db=benchtest oltp_read_write --tables=10 --table_size=100000 prepare
では、MySQL5.6 の結果から。
SQL statistics:
queries performed:
read: 2281482
write: 651852
other: 325926
total: 3259260
transactions: 162963 (271.59 per sec.)
queries: 3259260 (5431.83 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0278s
total number of events: 162963
Latency (ms):
min: 14.89
avg: 36.82
max: 523.16
95th percentile: 81.48
sum: 5999706.00
Threads fairness:
events (avg/stddev): 16296.3000/66.72
execution time (avg/stddev): 599.9706/0.01
続いて、MySQL5.7。
SQL statistics:
queries performed:
read: 3267684
write: 933561
other: 466790
total: 4668035
transactions: 233384 (388.96 per sec.)
queries: 4668035 (7779.82 per sec.)
ignored errors: 22 (0.04 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0163s
total number of events: 233384
Latency (ms):
min: 12.49
avg: 25.71
max: 387.50
95th percentile: 38.94
sum: 5999494.27
Threads fairness:
events (avg/stddev): 23338.4000/118.05
execution time (avg/stddev): 599.9494/0.00
最後に、MySQL8.0。
SQL statistics:
queries performed:
read: 3485944
write: 995915
other: 497968
total: 4979827
transactions: 248972 (414.94 per sec.)
queries: 4979827 (8299.46 per sec.)
ignored errors: 24 (0.04 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 600.0166s
total number of events: 248972
Latency (ms):
min: 11.88
avg: 24.10
max: 348.40
95th percentile: 35.59
sum: 5999406.79
Threads fairness:
events (avg/stddev): 24897.2000/98.79
execution time (avg/stddev): 599.9407/0.01
今回は MySQL5.6 と MySQL5.7 / 8.0 との性能差が浮き彫りとなりました。逆に 5.7 / 8.0 ではそこまでの性能差が出ませんでした。
総括
Oracle のブログに sysbench に関するグラフがあったので以下に引用しておきます。
これは Read Only における sysbench の結果ですが、同時接続が64を超えるあたりから明らかな性能差が確認できます。今回のベンチマークでは同時接続数を10までしか行っていないため、5.7 / 8.0 でそこまで差が出なかったのではないかと考えています。(あまりリッチな環境で検証をすると次はコストが心配になるもので。)
それにしても MySQL5.6 以降の性能向上には目を瞠るものがありました。これだけ性能面で向上していれば環境によっては RDS のインスタンスサイズを下げてもパフォーマンスが変わらないということも有り得そうです。MySQL8.0 はもしかしたらコスト面でも寄与してくれるのかも...?それはアップデートしてからのお楽しみということで。