【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】
【附件:截图/日志/监控】
新创建了一张表,想添加索引,发现添加索引需要大约3M ,想问下索引添加的原理是什么?如果说是添加索引需要遍历全表数据,那空表都没有数据不应该会3M 吧
错了是空表建索引为3S
好的 谢谢
空表建索引应该瞬间就完成,当时系统资源怎样呢
- 空表创建索引,也需要扫描表所在的region
- 索引是DDL语句,如果发起创建索引的tidb server是work,那么会先找到owner的tidb server,把create index的语句解析为job,放到add index队列,与所有的创建索引的语句串行执行;
- 创建索引是需要更新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 天后被自动关闭。不再允许新回复。