1年ほど前にRSSリーダーの開発をしていたとき、環境ごとのMySQLのパフォーマンスを調べるのにmysqlslap
というコマンドを使っていたが、割と適当に使っていたので今こそそれを振り返ってみようと思う。
そもそもmysqlslapが何かと言うと、MySQLの公式ドキュメントにはこのように書かれている。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.15 mysqlslap — クライアント負荷エミュレーション
mysqlslapはMySQLサーバのクライアント負荷をエミュレートし、各ステージのタイミングを報告する診断プログラムです。サーバにたいして複数のクライアントがアクセスしているかのように作動します。mysqlslapはMySQL 5.1.4.から提供されています。
なるほどなるほど、複数クライアントから接続されている状況をエミューレートできるんだね。
で、僕が検証に使っていたコマンドの一部がこんなのだった↓。ネットワークが影響しない状況で確認したかったからSSHで入ってlocalhostのMySQLに接続してテストした。
$ mysqlslap \
--no-defaults \
--concurrency=10 \
--iterations=1 \
--number-int-cols=2 \
--number-char-cols=3 \
--auto-generate-sql \
--engine=innodb \
--auto-generate-sql-add-autoincrement \
--auto-generate-sql-load-type=key \
--auto-generate-sql-write-number=2000 \
--number-of-queries=30000 \
--host=localhost \
--port=3306 \
--user=root
# 結果はこんなふうに出る
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 3.274 seconds
Minimum number of seconds to run all queries: 3.274 seconds
Maximum number of seconds to run all queries: 3.274 seconds
Number of clients running queries: 10
Average number of queries per client: 3000
それぞれのオプションがどんな意味なのかを見ていってみようと思う。
–no-defaults
設定ファイルに書かれているデフォルト値を無視するためのオプション。色々な環境で試すときにはこれをやっておくと環境ごとの差異をなくせる。
–concurrency=10
シミュレートする同時接続クライアントの数で、↑の場合は10。
–iterations=1
実行する回数。
–number-int-cols=2
使うINTカラムの数。
–number-char-cols=3
使うVARCHARカラムの数。
–auto-generate-sql
テストに使うSQLを自動生成する。ファイルやオプションでSQLが与えられていない場合。
–engine=innodb
エンジンはInnoDBだよね〜。
–auto-generate-sql-add-autoincrement
自動生成されたテーブルにAUTO_INCREMENTカラムを追加する。
–auto-generate-sql-load-type=key
テストのタイプを指定する。ここではkey(主キーの読み取り)
を使ったけど、他にも色々ある。
- read(テーブルのスキャン)
- write(テーブルの読み取り)
- update(主キーの更新)
- mixed(挿入とスキャンを半分ずつ)
–auto-generate-sql-write-number=2000
各スレッドで実行する挿入クエリの数。…ん?key
のときは意味ないのでは…
–number-of-queries=30000
クライアントで実行される合計のクエリ数。
–host=localhost
接続するホスト。
–port=3306
接続するポート番号。
–user=root
ユーザー名
こうやって見るとオプションが多すぎてきちんと把握していなかったな。よく見ると意味がないかもしれないオプションとかもある。