Tips

Amazon Auroraの性能検証メモ
2019.09.19

Amazon Auroraの性能検証メモ

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練習問題集

Recent News

Recent Tips

Tag Search