空表建索引

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】
【附件:截图/日志/监控】
新创建了一张表,想添加索引,发现添加索引需要大约3M ,想问下索引添加的原理是什么?如果说是添加索引需要遍历全表数据,那空表都没有数据不应该会3M 吧

错了是空表建索引为3S

可以看看这个
https://github.com/pingcap/tidb/pull/20550

1 个赞

好的 谢谢

空表建索引应该瞬间就完成,当时系统资源怎样呢

  1. 空表创建索引,也需要扫描表所在的region
  2. 索引是DDL语句,如果发起创建索引的tidb server是work,那么会先找到owner的tidb server,把create index的语句解析为job,放到add index队列,与所有的创建索引的语句串行执行;
  3. 创建索引是需要更新schema信息和统计信息,schema信息除了写入tikv,还需要PD通知tidb去更新schema的缓存

资源未出现瓶颈,cpu 负载 IO 啥的都没有过10%,创建索引比建表还要慢········

我复现了一下,确实需要 3s,查看日志主要耗时在这条日志上。

[2022/11/16 02:18:19.173 +00:00] [INFO] [ddl.go:1230] ["sleep before DDL finishes to make async commit and 1PC safe"] [duration=2.5s]

由于 tidb ddl 的特殊性与复杂性,相较于其他数据库确实会慢很多,但是 ddl 基本都是一次性工作,基本可以忽略不计。另外可以参考下面这个帖子的回复看是否对您有帮助:TIDB为什么 给一个空表创建索引会很慢呢 - #7,来自 centosredhat
还有 blog 讲 ddl 原理的 https://cn.pingcap.com/blog/tidb-source-code-reading-17

1 个赞

麻烦问下这个是看的哪个日志?

你好,是 tidb-server 的日志 tidb.log

好的 谢谢

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。