MySQLクライアント負荷エミュレーション mysqlslap を使う

#mysqlslap 

[MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.15 mysqlslap — クライアント負荷エミュレーション](http://dev.mysql.com/doc/refman/5.1/ja/mysqlslap.html)

> mysqlslapはMySQLサーバのクライアント負荷をエミュレートし、各ステージのタイミングを報告する診断プログラムです。サーバにたいして複数のクライアントがアクセスしているかのように作動します。mysqlslapはMySQL 5.1.4.から提供されています。

MySQLのパフォーマンスを測定する場合に、mysqlslapはとても便利です。MySQLを使用するシステムが増えてきているのか、毎年 mysqlslap を使って測定している気がします。

## インストール
MySQLがインストールされていれば、標準でインストールされます（MySQL 5.1.4以上）
MySQLサーバ上で実行する上では、特に問題ないでしょう。しかし、負荷テストを行う場合、APサーバ等リモートからも mysqlslap を実行したい場合があります。
その場合は、別途インストールしましょう。

```
sudo 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
```

```
Benchmark
	Running for engine innodb
	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
```

## オプション
ここでは、よく使うオプションのみ紹介します。
すべてのオプションは公式ページで確認してみてください。

| オプション | 説明 | 
|:-----------|:------------|
| --no-defaults | ディフォルト値を読み込まない |
| --concurrency | SELECTステートメントを発行している際、シミュレートするクライアントの数 |
| --iterations  | 実行するテストの回数 |
| --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 |クエリのタイプ(mixed|update|write|key|read)デフォルトは 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 | プログラムの終了時、作成したスキーマを削除しません |


## サンプル

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 
```

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 
```

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 
```

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 
```

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
```

## まとめ
MySQL限定ですが、リード・ライトのベンチマークを測るのに十分使えますね。