PIYO - Tech & Life -

mysqlslapコマンドの使いかた事例

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

ユーザー名

こうやって見るとオプションが多すぎてきちんと把握していなかったな。よく見ると意味がないかもしれないオプションとかもある。