Amazon Auroraの簡易負荷検証を行ったので、手順を記載していきます。
■用意した環境
・EC2(Amazon Linux 2、t2.micro)
・RDS(Aurora MySQL互換、db.r5.xlarge)
上記を同一VPC、サブネット内に作成しました。
■使用したツール
・Tera Term (EC2へのSSH接続で使用)
・MySQL WorkBench (Auroraの操作)
■目標
SELECT、INSERT、UPDATEが1秒間にどれくらい処理できるか調べる。
■手順
1. スキーマの作成
⇒「test_schema」という名前で作成しました。
2. テーブルの作成
テーブルは2つ作成します。
・「test_table」⇒ 検証用テーブル。int型のカラムを10個用意。
・「diff」⇒ 実行時間記録用テーブル。開始時刻、終了時刻、その差分を格納。
各テーブルのSQLは以下です。
create table test_table( id int primary key auto_increment, val1 int, val2 int, val3 int, val4 int, val5 int, val6 int, val7 int, val8 int, val9 int );
create table diff ( id int primary key auto_increment, time1 datetime(4), time2 datetime(4), diff float );
3. プロシージャの作成
負荷検証用のプロシージャを作成します。
今回はSELECT、INSERT、UPDATEに関する検証なので、それぞれ専用のプロシージャを作成します。
いずれも共通して、以下の構成で作成します。
① 現在時刻を取得(変数TIME1に代入)
② whileを使って、指定回数クエリ(SELECT、INSERT、UPDATEいずれか)を実行
③ 現在時刻を取得(変数TIME2に代入)
④ TIME1とTIME2の差分を計算(変数DIFFに代入)
⑤ diffテーブルにレコードを追加(TIME1、TIME2、DIFF)
実際に作成したプロシージャが以下です。
(↓SELECT用のプロシージャ)
delimiter // create procedure select_test() begin SET @i=1; SET @TIME1=NOW(4); while @i<=36000 do select * from test_table where id = @i; set @i=@i+1; end while; SET @TIME2=NOW(4); SET @DIFF=TIMESTAMPDIFF(MICROSECOND,@TIME1,@TIME2); insert into diff (time1,time2,diff) values (@TIME1,@TIME2,@DIFF/1000000); end // delimiter ;
これがSELECTの場合で、36000回実行するプロシージャになっています。
INSERT や UPDATE の場合は7~10行目のwhileの処理だけ変えていて、それぞれ以下の様に作成しました。
(↓INSERT用のプロシージャ)
delimiter // create procedure insert_test() begin SET @i = 1; SET @TIME1:=NOW(4); while @i<=37000 do START TRANSACTION; insert into test_table(val1,val2,val3,val4,val5,val6,val7,val8,val9) values (1000,2000,3000,4000,5000,6000,7000,8000,9000); COMMIT; set @i=@i+1; end while; SET @TIME2:=NOW(4); SET @DIFF:=TIMESTAMPDIFF(MICROSECOND,@TIME1,@TIME2); insert into diff (time1,time2,diff) values (@TIME1,@TIME2,@DIFF/1000000); end // delimiter ;
(↓UPDATE用のプロシージャ)
delimiter // create procedure update_test() begin SET @i=1; SET @TIME1:=NOW(4); while @i<22000 do START TRANSACTION; update test_table set val1 = 1000,val2 = 2000,val3 = 3000,val4 = 4000,val5 = 5000,val6 = 6000,val7 = 7000,val8 = 8000,val9 = 9000 where id = @i; COMMIT; set @i=@i+1; end while; SET @TIME2:=NOW(4); SET @DIFF:=TIMESTAMPDIFF(MICROSECOND,@TIME1,@TIME2); insert into diff (time1,time2,diff) values (@TIME1,@TIME2,@DIFF/1000000); end // delimiter ;
4. シェルスクリプトの作成
手順3で作成したプロシージャをEC2から呼び出すためのシェルスクリプトを作成します。
ファイルはEC2の任意のディレクトリに作成しましょう。
SELECTを呼び出すためのシェルスクリプトが以下です。
#!/bin/sh CMD_MYSQL="mysql -h ホスト名 -u ユーザー名 -pパスワード test_schema" i=1 while [ $i -lt 51 ] do $CMD_MYSQL -B -N -e "call select_test;" > /dev/null i=`expr $i + 1` done
ファイル名:「call_select.sh」
1回callするだけであればwhileは必要ありませんが、今回は試行回数を増やして平均の処理時間を確認したかったので50回ループしています。
同様にINSERTとUPDATEをcallするスクリプトが以下です。
#!/bin/sh CMD_MYSQL="mysql -h ホスト名 -u ユーザー名 -pパスワード test_schema" i=1 while [ $i -lt 51 ] do $CMD_MYSQL -B -N -e "call insert_test;" i=`expr $i + 1` done
ファイル名:「call_insert.sh」
#!/bin/sh CMD_MYSQL="mysql -h ホスト名 -u ユーザー名 -pパスワード test_schema" i=1 while [ $i -lt 51 ] do $CMD_MYSQL -B -N -e "call update_test;" i=`expr $i + 1` done
ファイル名:「call_update.sh」
5. 実行と結果の確認
準備はここまででOKです。
実行する際はEC2に接続して、手順4で作成したシェルスクリプトを実行します。
結果を確認するには、例えば以下のようなSQLで実行の平均時間が確認できます。
select avg(diff) from diff;
注意点として、SELECT、INSERT、UPDATEの全結果を同じテーブルに格納しているので、
異なるプロシージャを実行する時はdiffテーブルをtruncateして綺麗にしないといけないです。
(個別にテーブルを用意したりすればもう少し楽になると思います。)
今回手順3.のプロシージャで指定しているループ回数は今回の検証結果の回数ですが、
実際には「avg(diff)」で取得した秒数を見て回数を調整していくことになります。
6. 参考
最後に今回の検証結果は以下になります。
インスタンスサイズ等によって結果は変わってくると思うので、参考までに。
・SELECT ⇒ 36000回(平均1.003秒)
・INSERT ⇒ 37000回(平均1.018秒)
・UPDATE ⇒ 22000回(平均1.013秒)
SQLが学べる 関連連載リンク
データベースの基礎が学べるSQL基礎講座
SQL基礎 連載
練習問題を通じてSQL理解度アップの人気連載!
SQL練習問題集