tidb 加索引慢

张映 发表于 2021-08-19

分类目录: tidb

标签:,

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