tidb创建表耗时2分钟

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v4.0.6
  • 【问题描述】:使用navicat工具连接tidb,执行create table命令,创建一个8字段3索引的表,pre split region参数设置为6,显示创建表耗时120s。
    使用admin show ddl jobs查看时,显示该表创建开始时间和截止时间相差3s,job状态为已完成同步。
    疑问:创建表的真实时间以哪一个为准?为什么会有此差异。
    补充:在dashboard界面查看sql分析时,也显示的是120s。

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

直连 tidb server 看下执行时间

使用mysql命令行直连的ddl owner,情况是一样的。

感谢反馈, 可以将 admin show ddl jobs / create table 结果返回下.

admin show ddl jobs 已经显示job状态为public syned。但是,在navicat工具界面,或者mysql命令行界面仍旧没有返回,时间过了几十秒告诉我创建完成。

我的疑问,ddl 的新建表过程,在job syned完成后,实际还没有执行完么?后续还有哪些需要处理的环节呢?

看这ddl原理性的介绍文章,里面都是说ddl job状态为public和syned就是完成态了,如果是这样的,那么实际建表的耗时的以ddl job的时间为准?

是的,你的描述是正确的,可以检查下网络情况看为啥没有返回

可以抓一下火焰图
curl -G http://{TiDBIP}:10080/debug/zip?seconds=30" > profile.zip
ip地址为tidb服务器的ip,端口为tidb_status_port的端口

定位到原因了,是我开启了tidb_scatter_region,导致建表后多了region调度。
疑问,tidb_scatter_region开启后,默认建表只有一个region的情况也会慢很多,这一个region基本不用调度,为啥也会很慢呢?

1、建表命令,会需要提前分配一个region,防止下次插入时再创建 region,该过程会比较慢
2、创建 region 后,由于内部是 走的 raft 协议,实际上是创建了多个 region,且多个 region 创建 raft group 来保证高可用,region 需要分布在 不同节点上等原因,都会导致比单机库慢上一些
3、如果开启了 tidb_scatter_region,实际上开启了提前调度功能,尽管可能只创建了一个 region,但一些判断条件流程还是需要走的

1 个赞

明白了,感谢指导。

感谢指导。

有问题可随时再开帖讨论

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