クエリの性能検証にmysqlslapはどうですか?
GIS関数について続きを書こうと思ってたけど、mysqlslapを使ったのでその使い方について軽くメモしとく。
mysqlslapとは
mysqlslap は MySQL サーバーのクライアント負荷をエミュレートし、各段階のタイミングをレポートする診断プログラムです。 複数のクライアントがサーバーにアクセスしているかのように作動します。
(公式より)
少しわかりづらい言い方してますが、要するに 同じSQL文を「並列」に、「複数回」実行することができたり、特定の処理(SELECT,INSERT,UPDATE,DELETE)を流し続け、ベンチマークを測ることができるMySQLのツールです。
通常、MySQLサーバもしくはクライアントをインストールしていればそのまま使えます。(5.7.23時点)
使い方
主なオプションは以下の通り。
オプション | 説明 | 自動作成テーブル向け |
---|---|---|
-h, --host=name |
対象サーバのホスト名 | |
-P, --port=# |
対象サーバのポート番号 | |
-u, --user=name |
実行ユーザ | |
-p, --password[=name] |
パスワード | |
--csv | 実行結果をcsvファイルに出力する | |
--no-defaults | 設定ファイル(my.cnf)のデフォルト値を適用しない | |
-c, --concurrency |
同時接続するクライアント数 | |
-i, --iterations=# |
テストの実行回数 | |
-e, --engine=name |
テーブルを作成する際のストレージエンジンinnodbとmyisamが使える 基本はinnodbで固定でOKじゃないかと |
|
--create-schema=name | SQLを実行するスキーマ (指定したスキーマは自動で削除されるので注意) |
|
--no-drop | テスト後スキーマを削除しないようにする | |
-q, --query=name |
自前のSQLを指定し、実行させる | × |
-a, --auto-generate-sql |
SQLを自動生成して、実行する | 〇 |
--number-int-cols | --auto-generate-sql設定時に自動的に作られるテーブル内のINT型のカラム数 左記設定だと5カラム自動的に作る |
〇 |
--number-char-cols | --auto-generate-sql設定時に自動的に作られるテーブル内のvarchar型のカラム数 左記設定だと5カラム自動的に作る |
〇 |
--auto-generate-sql-add-autoincrement | --auto-generate-sql設定時に自動的に作られるテーブル内にauto_incrementを追加 | 〇 |
--auto-generate-sql-load-type | SQLクエリのタイプを指定クエリタイプ:mixed,update,write,key,read | 〇 |
--auto-generate-sql-write-number | スレッド毎のINSERT文の実行数 | 〇 |
--number-of-queries | 各クライアントが実行するSQLクエリの上限値 | |
--commit | n行ずつコミットする |
※全オプションについては公式の対象バージョンで確認してください。
例①:MySQLバージョンごとのベンチマークを取る
mysqlslap \ --user=root \ --password=xxxxx \ --engine=innodb \ --concurrency=5 \ --iterations=100 \ --create-schema=test \ --auto-generate-sql \ --auto-generate-sql-add-autoincrement \ --auto-generate-sql-load-type=mixed \ --auto-generate-sql-write-number=250 \ --number-of-queries=1000 \ --host=192.168.xxx.xxx \ --port=3306 \ --csv=bench_result_mysql.csv
結果はこんな感じで出力される。
$ cat bench_result_mysql.csv innodb,mixed,15.147,8.721,45.051,5,200
先頭は指定したengine 2つ目はauto-generate-sql-load-typeオプションで指定した値(デフォルトはmixed) 3つ目が平均時間(秒) 4つ目が最速時間(秒) 5つ目が最遅時間(秒) 6つ目はconcurrency 7つ目は1ユーザあたりが実行したクエリ数 です。
ちなみにログは追記型なので、もう一度mysqlslapコマンドを叩くと、指定したログファイルに結果が追記されます。
例②特定のクエリを実行する
mysqlslap \ --user=root \ --password=xxxxxx \ --engine=innodb \ --concurrency=5 \ --iterations=10 \ --create-schema=information_schema \ --no-drop \ --query="SELECT count(1) from information_schema.tables" \ --host=192.168.xxx.xxx \ --port=3306 \ --csv=mysqlslap_tab_cnt.csv
--queryで指定したクエリを5並列で10回ずつ実行します。
オプションはバージョンによって増減するので、使う環境によって確認してください。