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 はもしかしたらコスト面でも寄与してくれるのかも...?それはアップデートしてからのお楽しみということで。