DBに関しては、テスト環境で簡単なテストをして問題ないので、本番リリースすると性能がでないということがたまに起こります。本来は、負荷をかけて負荷テストを行えば良いのですが、システム全体を通しての負荷テストがなかなか出来ないことがあります。OSでよく利用されるmysql/mariadbに付属しているmysqlslapというツールを使って簡単な性能測定を行う方法について紹介したいと思います。
実行環境
今回は、dockerコンテナを利用して環境を構築します。mariadb(https://hub.docker.com/_/mariadb)の公式イメージを利用します。
イメージを取得します。
$ docker pull mariadb
今回は、コンテナ外からDBへ接続する為、MYSQL_USER
、MYSQL_PASSWORD
、MYSQL_DATABASE
を指定して起動しています。
$ docker run --name test-mariadb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=test-pass -e MYSQL_USER=test -e MYSQL_PASSWORD=test -e MYSQL_DATABASE=testDB -d mariadb:latest
テストデータをインサートします。今回は、10万件のデータを挿入しました。
USE testDB;
DROP Table IF EXISTS User;
CREATE TABLE User(
id int,
name TEXT,
password TEXT,
IsDelete int default 0
);
delimiter //
CREATE OR REPLACE PROCEDURE InsertTestData()
BEGIN
DECLARE i int default 0;
while i < 100000 do
Insert Into User ( id, name, password)
VALUES (i,"TestUser", "TestPassword");
set i=i+1;
end while;
END;
//
delimiter ;
CALL InsertTestData();
mysqlslapを使ってみます。
今回は、クエリSELECT * FROM testDB.User;
の速度を計測する想定で記載します。
$ mysqlslap \
--user=test \
--password=test \
--concurrency=10 \
--iterations=10 \
--create-schema=testDB \
--no-drop \
--query="SELECT * from testDB.User;" \
--host=127.0.0.1 \
--port=3306 \
--engine=innodb
オプション | 説明 |
–user | mariadbへ接続するuser名 |
–password | mariadbに接続する際のパスワード |
–port | mariadbに接続するポート番号 |
–host | 接続するmariadbのhost名(ipアドレス) |
–concurrency | シミュレートするクライアントの数 |
–iterations | 実行するテストの回数 |
–create-schema | テストを行うスキーマ |
–no-drop | テスト完了後にスキーマを削除しない。指定しないと削除される。 |
–query | 測定するクエリ |
–engine | ストレージエンジンを指定 |
クライント数、思考回数などを指定できるのでシステム等に合わせて簡単に測定を行うことができます。
下記のように出力されます。
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 0.827 seconds
Minimum number of seconds to run all queries: 0.769 seconds
Maximum number of seconds to run all queries: 0.873 seconds
Number of clients running queries: 10
Average number of queries per client: 1
他にも色々設定ができますが、詳しくは、mysqlslapの公式サイト(https://dev.mysql.com/doc/refman/8.0/en/mysqlslap.html)を確認してください。
まとめ
mysqlslapを利用して、クエリの計測を行う方法について紹介しました。mysql/mariadbのクライントをインストールしている場合には、すでに利用できるようになっているはずですので、一度試してみてはいかがでしょうか。