社区
教程
Wiki
注册
登录
创作新主题
社区所有版块导航
Python
python开源
Django
Python
DjangoApp
pycharm
DATA
docker
Elasticsearch
分享
问与答
闲聊
招聘
翻译
创业
分享发现
分享创造
求职
区块链
支付之战
aigc
aigc
chatgpt
WEB开发
linux
MongoDB
Redis
DATABASE
NGINX
其他Web框架
web工具
zookeeper
tornado
NoSql
Bootstrap
js
peewee
Git
bottle
IE
MQ
Jquery
机器学习
机器学习算法
Python88.com
反馈
公告
社区推广
产品
短视频
印度
印度
一周十大热门主题
如何用Python量化的方式找到处于底部横盘突破状态的牛股
保姆级教程:从 GitHub 代码到 Vercel+Cloudflare 部署全流程(附域名配置)
ChatGPT 要做广告和电商了,AI 将重塑营销业
【#ChatGPT使用政策更新##ChatGPT禁止提供专业医疗-20251103073719
机器学习学术速递[11.4]
Git 运维实战:基础设施即代码版本控制从零到生产级方案
连续两天 GitHub 热榜第一,这款工具火了!
数字法要闻 || 2025年11月4日:OpenAI 改进 ChatGPT 语言模型,提早识别心理压...
机器学习学术速递[11.3]
超火的自动化浏览器,15000+ GitHub Star!
关注
Py学习
»
DATABASE
MySQL如何在线扩展表结构,内核原理??(第27讲)
架构师之路
• 10 月前 • 234 次点击
《架构师之路:架构设计中的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个知识点》
短视频+图文+直播+星球社群,
免费
,欢迎感兴趣的童鞋关注。
宝藏号,
日更
。
点赞,转发,在看
,感激不尽!
Python社区是高质量的Python/Django开发社区
本文地址:
http://www.python88.com/topic/177306
登录后回复