オンラインワークロードとADD INDEX操作のインタラクションテスト
テスト目的
このドキュメントでは、OLTP シナリオにおけるオンライン ワークロードとADD INDEX操作間の相互作用効果をテストします。
テストバージョン、時間、場所
TiDB バージョン: v3.0.1
時期: 2019年7月
場所: 北京
テスト環境
このテストは、3 つの TiDB インスタンス、3 つの TiKV インスタンス、3 つの PD インスタンスがデプロイされた Kubernetes クラスターで実行されます。
バージョン情報
Sysbench バージョン: 1.0.17
TiDBパラメータ設定
TiDB、TiKV、PD はすべてデフォルトのTiDB Operator構成を使用します。
クラスタトポロジー
Sysbenchを使用したオンラインワークロードシミュレーション
Sysbench を使用して、 2,000,000 行のデータを含むテーブルをKubernetes クラスターにインポートします。
データをインポートするには、次のコマンドを実行します。
sysbench oltp_common \
--threads=16 \
--rand-type=uniform \
--db-driver=mysql \
--mysql-db=sbtest \
--mysql-host=$tidb_host \
--mysql-port=$tidb_port \
--mysql-user=root \
prepare --tables=1 --table-size=2000000
テストを実行するには、次のコマンドを実行します。
sysbench $testname \
--threads=$threads \
--time=300000 \
--report-interval=15 \
--rand-type=uniform \
--rand-seed=$RANDOM \
--db-driver=mysql \
--mysql-db=sbtest \
--mysql-host=$tidb_host \
--mysql-port=$tidb_port \
--mysql-user=root \
run --tables=1 --table-size=2000000
テストプラン1: ADD INDEX文の対象列への書き込み操作を頻繁に実行する
oltp_read_writeテストを開始します。- 手順
alter table sbtest1 add index c_idx(c)と同時に実行します。1 を使用してインデックスを追加します。 - 手順 2 の最後に実行します。インデックスが正常に追加されたら、テスト
oltp_read_writeを停止します。 alter table ... add indexの期間と、この期間の Sysbench の平均 TPS と QPS を取得します。- 2 つのパラメータ
tidb_ddl_reorg_worker_cntとtidb_ddl_reorg_batch_size値を徐々に増やし、手順 1 ~ 4 を繰り返します。
テスト結果
ADD INDEX操作なしのoltp_read_writeのテスト結果
tidb_ddl_reorg_batch_size = 32
tidb_ddl_reorg_batch_size = 64
tidb_ddl_reorg_batch_size = 128
tidb_ddl_reorg_batch_size = 256
tidb_ddl_reorg_batch_size = 512
tidb_ddl_reorg_batch_size = 1024
tidb_ddl_reorg_batch_size = 2048
tidb_ddl_reorg_batch_size = 4096
テストの結論
ADD INDEXの文のターゲット列に対して頻繁に書き込み操作(このテストではUPDATE INSERT DELETE操作が含まれます)を実行すると、デフォルトのADD INDEX構成はシステムのオンラインワークロードに大きな影響を与えます。これは主に、同時実行されるADD INDEX操作と列更新によって発生する書き込み競合が原因です。システムのパフォーマンスは次のようになります。
- パラメータ
tidb_ddl_reorg_worker_cntとtidb_ddl_reorg_batch_size値が増加すると、TiKV_prewrite_latch_wait_durationの値が大幅に増加し、書き込み速度が低下します。 tidb_ddl_reorg_worker_cntとtidb_ddl_reorg_batch_size値が非常に大きい場合、admin show ddlコマンドを実行すると、DDL ジョブの再試行回数(例えばWrite conflict, txnStartTS 410327455965380624 is stale [try again later], ErrCount:38, SnapshotVersion: 410327228136030220を確認できます。この場合、ADD INDEX操作の完了に非常に長い時間がかかります。
テストプラン 2: ADD INDEXステートメントのターゲット列への書き込み操作を実行しない (クエリのみ)
oltp_read_onlyテストを開始します。- 手順
alter table sbtest1 add index c_idx(c)と同時に実行します。1 を使用してインデックスを追加します。 - 手順 2 の最後に実行します。インデックスが正常に追加されたら、テスト
oltp_read_onlyを停止します。 alter table ... add indexの期間と、この期間の Sysbench の平均 TPS と QPS を取得します。- 2 つのパラメータ
tidb_ddl_reorg_worker_cntとtidb_ddl_reorg_batch_size値を徐々に増やし、手順 1 ~ 4 を繰り返します。
テスト結果
ADD INDEX操作なしのoltp_read_onlyのテスト結果
tidb_ddl_reorg_batch_size = 32
tidb_ddl_reorg_batch_size = 1024
tidb_ddl_reorg_batch_size = 4096
テストの結論
ADD INDEXのステートメントのターゲット列に対してのみクエリ操作を実行する場合、 ADD INDEX操作がオンライン ワークロードに与える影響は明らかではありません。
テストプラン3: ADD INDEX文のターゲット列はオンラインワークロードとは無関係です
oltp_read_writeテストを開始します。- 手順
alter table test add index pad_idx(pad)と同時に実行します。1 を使用してインデックスを追加します。 - 手順 2 の最後に実行します。インデックスが正常に追加されたら、テスト
oltp_read_onlyを停止します。 alter table ... add indexの期間と、この期間の Sysbench の平均 TPS と QPS を取得します。- 2 つのパラメータ
tidb_ddl_reorg_worker_cntとtidb_ddl_reorg_batch_size値を徐々に増やし、手順 1 ~ 4 を繰り返します。
テスト結果
ADD INDEX操作なしのoltp_read_writeのテスト結果
tidb_ddl_reorg_batch_size = 32
tidb_ddl_reorg_batch_size = 1024
tidb_ddl_reorg_batch_size = 4096
テストの結論
ADD INDEXのステートメントのターゲット列がオンライン ワークロードに関係ない場合、 ADD INDEXの操作がワークロードに与える影響は明らかではありません。
まとめ
ADD INDEXステートメントの対象列に対して、書き込み操作(INSERTDELETE操作を含む)を頻繁に実行すると、デフォルトのADD INDEXUPDATEでは比較的頻繁に書き込み競合が発生し、オンラインワークロードに大きな影響を与えます。同時に、ADD INDEX操作は継続的な再試行により完了までに長い時間がかかります。このテストでは、tidb_ddl_reorg_worker_cntとtidb_ddl_reorg_batch_sizeの積をデフォルト値の1/32に変更できます。例えば、tidb_ddl_reorg_worker_cntを4に、tidb_ddl_reorg_batch_sizeを256に設定すると、パフォーマンスが向上します。ADD INDEXステートメントのターゲット列に対してのみクエリ操作を実行する場合、またはターゲット列がオンライン ワークロードに直接関連していない場合は、デフォルトのADD INDEX構成を使用できます。













