41から始めました

文字通り41歳から始めたブログです。DB(MySQL)を使ってお仕事してるので、DB周りの話を中心に最近始めたこととかをTwitterのノリで書いています。なお、本サイトにおいて示されている見解は私個人の見解であり、所属団体や組織を代表するものではありません。

クエリの性能検証に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
テーブルを作成する際のストレージエンジンinnodbmyisamが使える
基本は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バージョンごとのベンチマークを取る

  • rootユーザでtestスキーマに対し、1000クエリ(そのうち250クエリはINSERT)を5並列で100回投げる。
  • 実行結果はbench_result_mysql8.csvに出力する
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回ずつ実行します。

オプションはバージョンによって増減するので、使う環境によって確認してください。