线上负载与 ADD INDEX 相互影响测试
测试目的
测试 OLTP 场景下,ADD INDEX 与线上负载的相互影响。
测试版本、时间、地点
TiDB 版本:v3.0.1
时间:2019 年 7 月
地点:北京
测试环境
测试在 Kubernetes 集群上进行,部署了 3 个 TiDB 实例,3 个 TiKV 实例和 3 个 PD 实例。
版本信息
Sysbench 版本:1.0.17
TiDB 参数配置
TiDB、TiKV 和 PD 均使用 TiDB Operator 默认配置。
集群拓扑
使用 Sysbench 模拟线上负载
使用 Sysbench 向集群导入 1 张表,200 万行数据。
执行如下命令导入数据:
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 目标列被频繁 Update
- 开始
oltp_read_write测试。 - 与步骤 1 同时,使用
alter table sbtest1 add index c_idx(c)添加索引。 - 在步骤 2 结束,即索引添加完成时,停止步骤 1 的测试。
- 获取
alter table ... add index的运行时间、sysbench 在该时间段内的平均 TPS 和 QPS 作为指标。 - 逐渐增大
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 与 Column Update 并发进行造成的写冲突,系统的表现反应在:
- 随着两个参数的逐渐增大,
TiKV_prewrite_latch_wait_duration有明显的升高,造成写入变慢。 tidb_ddl_reorg_worker_cnt与tidb_ddl_reorg_batch_size非常大时,admin show ddl命令可以看到 DDL job 的多次重试(例如Write conflict, txnStartTS 410327455965380624 is stale [try again later], ErrCount:38, SnapshotVersion:410327228136030220),此时ADD INDEX会持续非常久才能完成。
测试方案 2:ADD INDEX 目标列不涉及写入(仅查询)
- 开始
oltp_read_only测试。 - 与步骤 1 同时,使用
alter table sbtest1 add index c_idx(c)添加索引。 - 在步骤 2 结束,即索引添加完成时,停止步骤 1。
- 获取
alter table ... add index的运行时间、sysbench 在该时间段内的平均 TPS 和 QPS 作为指标。 - 逐渐增大
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测试。 - 与步骤 1 同时,使用
alter table test add index pad_idx(pad)添加索引。 - 在步骤 2 结束,即索引添加完成时,停止步骤 1 的测试。
- 获取
alter table ... add index的运行时间、sysbench 在该时间段内的平均 TPS 和 QPS 作为指标。 - 逐渐增大
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的目标列被频繁更新(包含UPDATE、INSERT和DELETE)时,默认配置会造成较为频繁的写冲突,使得在线负载较大;同时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的目标列仅涉及查询负载,或者与线上负载不直接相关时,可以直接使用默认配置。













