

mysqlslapでInnoDBに並列300クライアントの負荷テストをかけてみた
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
何をやったか
MySQLに標準で入っている mysqlslap を使って、InnoDBテーブルに対する負荷テストをやってみた。別途ベンチマークツールを用意しなくても、MySQLクライアントが入っていればすぐ使える。
使ったコマンドはこれ。
mysqlslap -u <username> -p -h <hostname> \ --engine=innodb \ --concurrency=300 \ --iterations=30 \ --auto-generate-sql \ --auto-generate-sql-load-type=mixed \ --number-char-cols=30 \ --number-int-cols=20 \ --auto-generate-sql-write-number=100000--auto-generate-sql を付けると、テーブル定義もINSERT文もSELECT文もmysqlslap側で自動生成してくれる。CREATE TABLEやクエリを手書きしなくていいのが楽。
オプションの内容
| オプション | 意味 |
|---|---|
-u <username> |
接続に使うMySQLユーザー名 |
-p |
パスワード入力を求める(値を直接書かない) |
-h <hostname> |
接続先ホスト |
--engine=innodb |
テーブル作成に使うストレージエンジン |
--concurrency=300 |
同時に動かすクライアント数(並列数) |
--iterations=30 |
テストを繰り返す回数 |
--auto-generate-sql |
CREATE/INSERT/SELECTを自動生成する |
--auto-generate-sql-load-type=mixed |
負荷の種類。read(SELECTのみ)、write(INSERTのみ)、key(PK検索)、update(PK更新)、mixed(INSERTとSELECTを半々)から選べる。デフォルトもmixedなので明示しなくても同じ挙動 |
--number-char-cols=30 |
自動生成テーブルのVARCHAR列数 |
--number-int-cols=20 |
自動生成テーブルのINT列数 |
--auto-generate-sql-write-number=100000 |
各スレッドが実行するINSERT行数 |
気づいたこと
mixedはデフォルト値なので、--auto-generate-sql-load-type=mixedは書かなくても同じ結果になる。明示しておくと後で読んだときに意図が分かりやすいのでそのままにした。--auto-generate-sql-write-numberはmixed/writeのときのINSERT側に効くオプションで、read/keyだけのテストでは使われない。--concurrency=300はそれなりに重い負荷になるので、本番相当の環境で叩く前にDB側のmax_connectionsや接続元のリソースを確認しておいたほうがいい。
テスト後の後片付け
--auto-generate-sql でテーブルを自動作成した場合、テスト終了時にmysqlslapが自動でスキーマをDROPする。残しておきたい場合は --no-drop を付ける必要がある。
mysqlslap -u <username> -p -h <hostname> \ --engine=innodb \ --concurrency=300 \ --iterations=30 \ --auto-generate-sql \ --no-drop