专栏名称: 架构师之路
架构师之路,坚持撰写接地气的架构文章
目录
相关文章推荐
架构师之路  ·  我怎么知道自己适不适合做程序员?(很严肃) ·  2 天前  
架构师之路  ·  关于即时通讯架构的一切! ·  4 天前  
美团技术团队  ·  让迪拜,见证中国配送新速度 ·  6 天前  
架构师之路  ·  手贱删了DB,如何快速恢复?(第24讲) ·  1 周前  
架构师之路  ·  超经典,网页判重核心技术!(第25讲) ·  6 天前  
51好读  ›  专栏  ›  架构师之路

MySQL如何在线扩展表结构,内核原理??(第27讲)

架构师之路  · 公众号  · 架构  · 2024-12-24 12:14

正文

《架构师之路:架构设计中的100个知识点》
27.MySQL在线扩展表结构
一个海量数据高并发的业务场景,产品经理前期没想清楚,现在想要增加业务属性,MySQL要扩展表结构,有什么办法吗?

方案一:alter table add column,行不行?
不可行,海量数据高并发情况下会锁表。

通过增加表的方式扩展,通过外键join来查询,行不行?
不可行,外键影响性能,连表影响性能,海量数据高并发情况下不行。

通过增加表的方式扩展,通过视图来查询,行不行?
不可行,视图影响性能,海量数据高并发情况下不行。

揍产品经理,避免需求变更,行不行?
不可行,打赢坐牢,打输住院。

提前预留一些reserved字段,以备扩展,行不行?
可行。但如果预留过多,会造成空间浪费,预留过少,不一定达得到扩展效果。

MySQL的online-schema-change,在线扩展字段,行不行?
可行。且这是标配。

MySQL的online-schema-change的原理是怎么样的?如何能在海量数据高并发的场景下,平滑扩展字段呢?

假设原表为:user(id, name)
希望扩展字段升级为:user(id, name, age)

第一步,创建新表user_new(id, name, age),也就是扩展字段后的表;
第二步,创建触发器,对原表user进行的所有写操作insert/delete/update,对新表进行相同的操作;
第三步,逐步迁移数据,分批限速将user表中的数据库,迁移到user_new表;
第四步,删掉触发器,移走原表;
第五步,将新表user_new重命名rename为原表user,字段扩展完成;

整个过程不需要加大锁,可以持续对外提供服务。

MySQL的online-schema-change有什么注意事项吗?

有三点要注意:
其一,被迁移的表要求有主键,这个条件一般都满足;
其二,扩展过程中要建立触发器,原表如果已经有很多触发器,方案就不行,但互联网海量数据高并发的场景下,一般都不允许业务触发器;
其三,由于触发器的建立,会影响原表性能,因此这个操作最好在流量低峰期进行

pt-online-schema-change是互联网MySQL-DBA必备的利器,在互联网公司使用广泛。

知其然,知其所以然。

思路比结论更重要。


补充阅读材料:
pt-online-schema-change介绍
https://docs.percona.com/percona-toolkit/pt-online-schema-change.html

==全文完==


20年,系列1(已完结)
流量从10万到10亿,遇见的80个架构问题

21年,系列2(已完结)
关于即时通讯架构的一切!

24年,系列3(进行中)
《架构设计中的100个知识点》
短视频+图文+直播+星球社群,免费,欢迎感兴趣的童鞋关注。

宝藏号,日更

点赞,转发,在看,感激不尽!