このトピックでは、テーブルの単一行のホットデータを更新する際における ApsaraDB RDS for MySQL インスタンスのパフォーマンスをテストおよび分析する方法について説明します。
Inventory Hint 機能を使用すると、テーブルの単一行のホットデータを更新する際における ApsaraDB RDS for MySQL インスタンスのパフォーマンスを向上させることができます。この機能の詳細については、「Inventory Hint」をご参照ください。
テスト環境
このテストでは、RDS High-Availability Edition を実行し、rds.mysql.st.v52 インスタンスタイプを使用する RDS インスタンスと、RDS Enterprise Edition を実行し、mysql.st.12xlarge.25 インスタンスタイプを使用する RDS インスタンスを使用します。
データベースエンジンとバージョン: MySQL 5.7
仕様: 90 CPU コア、720 GB メモリ(専用ホストインスタンスファミリー)
RDS エディション: RDS High-Availability Edition および RDS Enterprise Edition
ストレージタイプ: プレミアムローカル SSD
テンプレート: パフォーマンス専有型パラメーターテンプレート
テストデータ
テストに使用されるテーブルには 100 行が含まれています。次のコードスニペットは、テーブルスキーマを示しています。
CREATE TABLE `sbtest1`
(
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT
,`k` INT(10) UNSIGNED NOT NULL DEFAULT '0'
,`c` CHAR(120) NOT NULL DEFAULT ''
,`pad` CHAR(60) NOT NULL DEFAULT ''
,PRIMARY KEY (`id`)
,KEY `k_1` (`k`)
)
ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT
CHARSET=utf8 MAX_ROWS=1000000
テストスクリプト
ID が 100 の行に対して同時更新を実行するには、次の SQL 文を実行します。
UPDATE sbtest1 SET k=k+1 WHERE id=100
テストには、次の Lua スクリプトが使用されます。
pathtest = string.match(test,"(.*/)") -- pathtest はテストパスの正規表現にマッチします。
if pathtest then -- pathtest が存在する場合
dofile(pathtest .."common.lua") -- pathtest と common.lua を連結したパスにあるファイルをロードします。
else -- pathtest が存在しない場合
require("common") -- common モジュールをロードします。
end
function thread_init(thread_id) -- スレッド初期化関数
set_vars() -- 変数を設定します。
end
function event(thread_id) -- イベント関数
local table_name -- ローカル変数 table_name を宣言します。
table_name ="sbtest".. sb_rand_uniform(1, oltp_tables_count) -- table_name にランダムなテーブル名を代入します。
rs = db_query("begin") -- トランザクションを開始します。
rs = db_query("update /*+commit_on_success rollback_on_fail target_affect_row(1) */ sbtest1 SET k=k+1 WHERE id=100") -- sbtest1 テーブルの id が 100 の行の k 値を更新します。成功時はコミット、失敗時はロールバックします。影響を受ける行数は 1 です。
rs =db_query("commit") -- トランザクションをコミットします。
end
テスト結果
インスタンスタイプ | 単一行の最大 TPS |
RDS High-Availability Edition | 12,000 |
RDS Enterprise Edition | 31,000 |
図 1. RDS Enterprise Edition のテスト結果