tidb加索引非常慢,一张表5W多条数据,加了40多秒
mysql> select count(1) from title_tag_item; +----------+ | count(1) | +----------+ | 54219 | +----------+ 1 row in set (0.05 sec) mysql> ALTER TABLE `title_tag_item` ADD INDEX `idx_tag_id`(`tag_id`) USING BTREE; Query OK, 0 rows affected (42.88 sec) mysql> set global tidb_ddl_reorg_batch_size = 10240; Query OK, 0 rows affected (0.23 sec) mysql> set global tidb_ddl_reorg_worker_cnt = 16; Query OK, 0 rows affected (0.16 sec) mysql> DROP INDEX idx_tag_id ON title_tag_item; Query OK, 0 rows affected (2.06 sec) mysql> ALTER TABLE `title_tag_item` ADD INDEX `idx_tag_id`(`tag_id`) USING BTREE; Query OK, 0 rows affected (6.53 sec)
tidb_ddl_reorg_worker_cnt
作用域:GLOBAL
默认值:4
这个变量用来设置 DDL 操作 re-organize 阶段的并发度。
tidb_ddl_reorg_batch_size
作用域:GLOBAL
默认值:256
这个变量用来设置 DDL 操作 re-organize 阶段的 batch size。比如 ADD INDEX 操作,需要回填索引数据,通过并发 tidb_ddl_reorg_worker_cnt 个 worker 一起回填数据,每个 worker 以 batch 为单位进行回填。
如果 ADD INDEX 操作时有较多 UPDATE 操作或者 REPLACE 等更新操作,batch size 越大,事务冲突的概率也会越大,此时建议调小 batch size 的值,最小值是 32。
在没有事务冲突的情况下,batch size 可设为较大值,最大值是 10240,这样回填数据的速度更快,但是 TiKV 的写入压力也会变大。
转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/tidb/2519.html