mysqlslapによるmysqlベンチマーク解説

mysqlslapとは，MySQLが公式でサポートしている 負荷エミュレーションクライアントです。
公式ドキュメント:https://dev.mysql.com/doc/refman/5.6/ja/mysqlslap.html

### mysqlslapインストール

```
yum install -y mysql-bench
```
 
### 実行例
```
mysqlslap \
  --no-defaults \
  --concurrency=50 \
  --iterations=10 \
  --engine=innodb \
  --auto-generate-sql \
  --auto-generate-sql-add-autoincrement \
  --auto-generate-sql-load-type=mixed \
  --auto-generate-sql-write-number=1000 \
  --number-of-queries=100000 \
  --host=localhost \
  --port=3306 \
  --user=root
```
 
※ユーザやパスワード，ポートやホストの指定といった設定は，mysqlコマンドクライアントと同じものが使えます。
そのため，アプリケーションサーバからMySQLサーバへの負荷ベンチを取りたい場合にも使うことができます。


### 結果例
```
Benchmark
    Running for engine innodb #DBエンジン
    Average number of seconds to run all queries: 9.451 seconds #平均実行時間
    Minimum number of seconds to run all queries: 9.288 seconds #最小実行時間
    Maximum number of seconds to run all queries: 9.704 seconds #最大実行時間
    Number of clients running queries: 50 #クライアントの数
    Average number of queries per client: 2000 #クライアントが発行したSQLの数
```

### よく使うオプション
```
オプション:説明
--no-defaults:ディフォルト値を読み込まない
--concurrency:SELECTステートメントを発行している際、シミュレートするクライアントの数
--iterations:実行するテストの回数(同じテストを繰り返して平均値をとるため。10回くらいが妥当)
--number-int-cols:使用するINTカラムの数 --auto-generate-sqlが特定されている場合(50くらいが限界)
--number-char-cols:使用するVARCHARカラムの数 --auto-generate-sqlが特定されている場合(50くらいが限界)
--engine:テーブル作成の際使用するストレージエンジン(innodb,myisam)
--auto-generate-sql:ファイルやコマンドオプションを介して提供されていない場合、SQLステートメントを自動的に生成します
--auto-generate-sql-add-autoincrement:auto_incrementのカラムを追加
--auto-generate-sql-load-type:クエリのタイプ。
※read(テーブルスキャン)、write(テーブルへの挿入)、 key(主キー読み取り)、mixed(挿入とテーブルスキャンを半々)
--auto-generate-sql-write-number:スレッド毎の INSERT 文の発行数。デフォルトは 100
--number-of-queries:各クライアントをこのクエリの数に限定します。このオプションはMySQL 5.1.5．で追加されました
--host:与えられたホスト上でMySQLサーバに接続します
--port:コネクションに使用するTCP/IPポート番号です
--user:サーバに接続する際使用するMySQLユーザ名です
--csv:カンマによって分けられた値のフォーマットで出力を生成します。出力は名づけられたファイルか、ファイルが提供されていない場合標準出力に向かいます。このオプションはMySQL 5.1.5．で追加されました。
--create-schema:テストを実行するスキーマ。このオプションはMySQL 5.1.5．で追加されました
--delimiter:ファイルかコマンドオプションを介して提供されたSQLステートメントで使用するデリミタで
--only-print:データベースに接続しないでください。mysqlslapは実行されるべきであったことだけプリントします。このオプションはMySQL 5.1.5．で追加されました
--password:サーバに接続する際使用するパスワードです。ショートオプションフォーム(-p)を使用した場合、オプションとパスワードの間にスペースを置くことはできません。password値を --passwordあるいは-pオプションをコマンドライン上で省いた場合、ここで求められます
-–no-drop:プログラムの終了時、作成したスキーマを削除しません
```

### 実行例
```
# 実行例1
#50スレッド 1000行データ 1000クエリ read(テーブルスキャン)
mysqlslap \
 --no-defaults --auto-generate-sql --engine=innodb --auto-generate-sql-add-autoincrement \
 --host=localhost --port=3306 -u root \
 --number-int-cols=10 \
 --number-char-cols=10 \
 --iterations=10 \
 --concurrency=50 \
 --auto-generate-sql-write-number=1000 \
 --number-of-queries=1000 \
 --auto-generate-sql-load-type=read
 
# 実行例2
#50スレッド 1000行データ 1000クエリ write(テーブルへの挿入)
mysqlslap \
 --no-defaults --auto-generate-sql --engine=innodb --auto-generate-sql-add-autoincrement \
 --host=localhost --port=3306 -u root \
 --number-int-cols=10 \
 --number-char-cols=10 \
 --iterations=10 \
 --concurrency=50 \
 --auto-generate-sql-write-number=1000 \
 --number-of-queries=1000 \
 --auto-generate-sql-load-type=write
 
# 実行例3
#50スレッド 1000行データ 1000クエリ key(主キー読み取り)
mysqlslap \
 --no-defaults --auto-generate-sql --engine=innodb --auto-generate-sql-add-autoincrement \
 --host=localhost --port=3306 -u root \
 --number-int-cols=10 \
 --number-char-cols=10 \
 --iterations=10 \
 --concurrency=50 \
 --auto-generate-sql-write-number=1000 \
 --number-of-queries=1000 \
 --auto-generate-sql-load-type=key
 
# 実行例4
#50スレッド 1000行データ 1000クエリ mixed(挿入とテーブルスキャンを半々)
mysqlslap \
 --no-defaults --auto-generate-sql --engine=innodb --auto-generate-sql-add-autoincrement \
 --host=localhost --port=3306 -u root \
 --number-int-cols=10 \
 --number-char-cols=10 \
 --iterations=10 \
 --concurrency=50 \
 --auto-generate-sql-write-number=1000 \
 --number-of-queries=1000 \
 --auto-generate-sql-load-type=mixed
 
# 実行例5
#50スレッド 1000行データ 1000クエリ update(更新)
mysqlslap \
 --no-defaults --auto-generate-sql --engine=innodb --auto-generate-sql-add-autoincrement \
 --host=localhost --port=3306 -u root \
 --number-int-cols=10 \
 --number-char-cols=10 \
 --iterations=10 \
 --concurrency=50 \
 --auto-generate-sql-write-number=1000 \
 --number-of-queries=1000 \
 --auto-generate-sql-load-type=update
```