# 动态调整创建索引的速度（A）

![left](./student-guide/diagram/19-Speed-of-index-creation-01-01.png)

-------------------------------------------------------------
动态调整创建索引的速度

由于创建索引在扫表回填索引的时候会消耗大量资源，甚至与一些频繁更新的字段会发生冲突导致正常业务受到影响。大表创建索引的过程往往会持续很长时间，所以要尽可能地平衡执行时间和集群性能之间的关系。

目前主要使用 tidb_ddl_reorg_worker_cnt 和 tidb_ddl_reorg_batch_size 这两个参数来动态调整索引创建速度，通常来说它们的值越小对系统影响越小，但是执行时间越长。

根据以往的经验，我们可以先将值保持为默认的 4 和 256 ，观察集群资源使用情况和响应速度，再逐渐调大tidb_ddl_reorg_worker_cnt 参数来增加并发，观察监控如果系统没有发生明显的抖动，再逐渐调大tidb_ddl_reorg_batch_size 参数，但如果索引涉及的列更新很频繁的话就会造成大量冲突造成失败重试。2

另外还可以通过调整 tidb_ddl_reorg_priority 为 PRIORITY_HIGH 来让创建索引的任务保持高优先级来提升速度，但在通用 OLTP 系统上，一般建议保持默认。
评估创建索引的速度

在线创建索引时，我们需要时刻关注两件事情：
- 一件是创建索引对系统的压力，我们可以通过 Grafana 的 dashboard 来查看系统的压力
- 一件是创建索引的速度，当系统压力不大的时候，我们可以适当的调整创建索引的速度
在上图中，我们可以通刷新 admin show ddl 来查看当前已经处理了多少行数据。通过 select count(*) 可以查看到添加索引的表的行数，从而估算一下当前的进度。

控制创建索引并发度
控制每次创建索引数据的数量
调整创建索引优先级。参数有 PRIORITY_LOW/PRIORITY_NORMAL/PRIORITY_HIGH
失败重试次数，如果超过该次数创建索引会失败

