【 TiDB 使用环境】测试
【 TiDB 版本】
【复现路径】
分库分表创建需要建1024*30张表,发现效率很低
【遇到的问题:问题现象及影响】
参考了官方文档,说
“为了更快地建表,推荐通过并发发送多个 DDL 请求以达到最快建表速度。如果串行地发送 DDL 请求,并且没有发给 Owner 节点,则建表速度会很慢。”
请问哪位大佬有具体的例子?
升级到8.1版本,有ddl建表优化
写个脚本,比如python之类的多线程并发建表
1 个赞
tidb建表是串行的,并发不了
并发不了,但是可以并发请求放到执行队列里,这样会快
多个连接 不同的tidb实例 发送ddl,服务器性能不是问题。估计也不是一时半会创建好。
DDL执行就是队列串行的
也要适当调整并发度以避免过度负载
和运行主机的性能有没有关系呢,可以看下
既然是分库分表,表结构都是一样的吧,那么create table a like b是不是比较快点
升级8版本,有针对优化
串行执行的,建议升级8
DDL执行就是队列串行的
DDL 是队列呀 快不了吧
MySQL8.0版本,推出了INSTANT方式,只修改MetaData,不影响表数据,所以执行效率跟表大小几乎没有关系
全称叫“在线DDL之 快速增加列”(秒级别的),并不会造成业务抖动。该功能自 MySQL 8.0.12 版本引入,是由腾讯游戏DBA团队贡献,我国程序员还是挺厉害的
参考 Functionality Added or Changed
InnoDB
now supports ALGORITHM=INSTANT
for the following ALTER TABLE
operations:
- Adding a column. This feature is referred to as “Instant
ADD COLUMN
”. - Adding or dropping a virtual column.
- Adding or dropping a column default value.
- Modifying the definition of an
ENUM
orSET
column. - Changing the index type.
- Renaming a table.
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-12.html
但是目前好像只支持ADD COLUMN和Renaming a table
感谢各位指导。我感觉原文的含义是先把所有建表DDL都先发送到队列里面统一等待,而不是串行的发送create table的DDL,得到成功后再发送。
实际上这里没有考虑这些建表语句可能存在依赖关系,譬如我创建b表的前提是a表创建成功了。
应该没问题吧
这种的只能业务上去控制吧,数据库应该控制不了。
建表串行,试试新版本的TiDB