検証においての前置き
なぜこの検証を実施したか
MySQL利用の際に並列度を上げればある程度qps(commit per sec?)はあげられます。
今回はアプリケーション実装やシステム環境の制約により、1接続にて順次データを導入していく必要性がありました。
次の節にて要件および制約条件を書きます。
制約条件・要件
- 挿入・更新を実施するMySQLは1つだけ・参照系は複数接続あり
- RDSリードレプリカの利用は想定しない
- 速度的に問題なければバイナリログ関連設定の変更は行いたくない
- PITRなどへの影響は最小限にしたい
検証
調整内容
以下2点に絞って検証しました。
- InnoDB xaサポートの無効化(innodb_support_xa=0)
- InnoDB ログフラッシュ時のsync(innodb_flush_log_at_trx_commit=2)
結果
3回実施の中間値です。
Mangetic | gp2 | PIOPS1000 | |
---|---|---|---|
None | 3.551 | 2.278 | 2.142 |
xa | 1.370 | 1.029 | 1.022 |
flush | 2.074 | 1.290 | 1.086 |
xa+flush | 1.357 | 1.276 | 1.046 |
- xa = innodb_support_xa=0
- innodb_flush_log_at_trx_commit=2
余談ですが、この結果より innodb_support_xa=0
を適用することにしました。
考察
PIOPSをもっと大きく(例:PIOPS10000)などにすると結果が変化するかもしれません。
検証方法
mysqlslapで、ひたすら直線的にinsertを行う方法で実施しました。
time mysqlslap \
--user=${USER} \
--password=${PASSWD} \
--host=${RDSHOST} \
--port=3306 \
--engine=innodb \
--auto-generate-sql \
--auto-generate-sql-load-type=write \
--auto-generate-sql-add-autoincrement \
--number-char-cols=5 \
--number-int-cols=10 \
--number-of-queries=1000 \
--concurrency=1 \
--iterations=10