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

今更ながらですが、今年(2018)の4月にMySQL8.0の製品版がリリースされました。
色々と新規、改善された機能があるのですが、個人的には[MySQL 8.0: MySQL 5.7よりも最大2倍高速](https://www.mysql.com/jp/products/enterprise/database/)という所が気になり、ちょっと試してみました。
# 前提
- 環境  
 - AWS EC2 t2.small(vCPU1 メモリ2GB) ×２（5.7と8.0でサーバーを分ける）
 - AMI Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type 
 - MySQL 5.7.23、8.0.12 (すべてデフォルト設定)
- 検証ツール
 - [sysbench](https://github.com/akopytov/sysbench) 1.0.15  

# 準備
- MySQLのインストール
 - こちら参考にさせていただきました  
   5.7 https://hit.hateblo.jp/entry/2016/12/20/114402  
   8.0 https://hit.hateblo.jp/entry/MYSQL/8.0/INSTALL  
 - 8.0では追加で以下のコマンドを実施（sysbench実施、error1251が発生したため）

```sql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
```

- sysbenchのインストール
 - こちら参考にさせていただきました  
   https://www.s-style.co.jp/blog/2018/03/1605/
- データの準備
 - 測定用データベースの作成

```sql
create database benchmark;
```
 - sysbenchでデータの作成（レコードは１００万行）

```bash
sysbench --db-driver=mysql \
      --mysql-host=localhost \
      --mysql-user=root \
      --mysql-password=password \
      --mysql-db=benchmark \
      --table_size=1000000 \
      oltp_read_write \
      prepare
```

# 測定（３０秒間でのトランザクション数）
* oltp_read_only

```bash
sysbench --db-driver=mysql \
      --mysql-host=localhost \
      --mysql-user=root \
      --mysql-password=password \
      --mysql-db=benchmark \
      --time=30 \
      --threads=1 \
      oltp_read_only \
      run
```
|        | MySQL5.7                  | MySQL8.0                 |
|:-------|:--------------------------|:-------------------------|
| 1回目   | 20836  (694.45 per sec.) | 19619  (653.89 per sec.) |
| 2回目   | 22860  (761.93 per sec.) | 19946  (664.79 per sec.) |
| 3回目   | 22461  (748.63 per sec.) | 19821  (660.64 per sec.) |
| 4回目   | 22980  (765.93 per sec.) | 19832  (661.00 per sec.) |
| 5回目   | 23061  (768.61 per sec.) | 19897  (663.16 per sec.) |

* oltp_write_only

```bash
sysbench --db-driver=mysql \
      --mysql-host=localhost \
      --mysql-user=root \
      --mysql-password=password \
      --mysql-db=benchmark \
      --time=30 \
      --threads=1 \
      oltp_write_only \
      run
```
|        | MySQL5.7                  | MySQL8.0                 |
|:-------|:--------------------------|:-------------------------|
| 1回目   | 14603  (486.72 per sec.) | 6686   (222.82 per sec.) |
| 2回目   | 15425  (514.10 per sec.) | 6684   (222.78 per sec.) |
| 3回目   | 15683  (522.69 per sec.) | 6798   (226.55 per sec.) |
| 4回目   | 14369  (478.90 per sec.) | 6772   (225.70 per sec.) |
| 5回目   | 15671  (522.31 per sec.) | 6750   (224.96 per sec.) |

* oltp_read_write

```bash
sysbench --db-driver=mysql \
      --mysql-host=localhost \
      --mysql-user=root \
      --mysql-password=password \
      --mysql-db=benchmark \
      --time=30 \
      --threads=1 \
      oltp_read_write \
      run
```
|        | MySQL5.7                  | MySQL8.0                 |
|:-------|:--------------------------|:-------------------------|
| 1回目   | 7428   (247.57 per sec.) | 4410   (146.98 per sec.) |
| 2回目   | 7851   (261.68 per sec.) | 4632   (154.37 per sec.) |
| 3回目   | 7907   (263.54 per sec.) | 4533   (151.07 per sec.) |
| 4回目   | 8002   (266.69 per sec.) | 4745   (158.15 per sec.) |
| 5回目   | 8029   (267.61 per sec.) | 4574   (152.44 per sec.) |

# 感想
あれ？MySQL8.0の方が遅い・・・？
検証しているサーバーが逆じゃないか、何度も確かめたがやはり間違いはなかった。
結果だけ見ると特にwrite系の処理で差が出ているように見える。
デフォルトの設定でチューニングも何もしていないからか、チューニング次第で速くなるのかな？それとも他の要因？
もしそうであればもう少し調査してから実運用を検討したい。

# 参考
* MySQLのインストール  
https://hit.hateblo.jp/entry/2016/12/20/114402  
https://hit.hateblo.jp/entry/MYSQL/8.0/INSTALL
* sysbenchのインストール  
https://www.s-style.co.jp/blog/2018/03/1605/

# 追記
* 10/4 Enterprise editionではなくCommunity editionで計測したので、そこの違いかもしれません