当前位置: 首页 > article >正文

多租户下的系统业务开发过程探讨痛

一、背景与问题缘起MySQL 5.6.51 版本下 2000 万行核心业务表开展新增字段操作需求为新增BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释因业务实际需要存储大数值关联字段。表的核心特性为Java 多线程密集读写业务请求持续高频初始执行原生ALTER TABLE语句时出现两大核心问题72 万行测试表执行耗时 203 秒线性推算 2000 万行表耗时超 1.5 小时生产执行时触发表锁、查询失效严重影响业务正常运行。本次实操的核心挑战集中在MySQL 5.6 版本未支持高版本的表结构元数据原地修改优化、大表全量数据拷贝的 IO 资源占用、高频读写场景下的资源竞争、MDL 锁等待导致的锁表风险需通过针对性方案实现无锁、无业务感知、高效的字段新增。二、核心问题根源剖析2.1 MySQL 5.6 Online DDL 的先天局限MySQL 5.6 虽引入 InnoDB Online DDL 特性解决了传统 DDL 锁表阻塞业务的问题但未支持高版本5.7/8.0的元数据原地修改优化—— 新增任何类型字段均需全表拷贝数据而拷贝过程会占用大量磁盘 IO这是大表 DDL 执行慢的核心根源。尤其对于 2000 万行表全表拷贝的 IO 开销成为性能瓶颈72 万行小表测试耗时 203 秒的核心原因也在于此。2.2 显式默认值对 DDL 的优化作用MySQL 5.6 对原生数值类型TINYINT/INT/BIGINT 简单常量默认值如 0的 DDL 操作有轻量级优化无默认值时需全表拷贝 逐行初始化字段值而显式指定默认值后会优化为全表拷贝 批量赋值默认值减少 60% 以上的 IO 开销且该优化对数值类型的适配性远优于 VARCHAR 类型BIGINT 比 VARCHAR 的执行效率更高、资源占用更低。2.3 锁表的真正元凶MDL 锁等待与长事务阻塞执行ALTER TABLE时出现的表锁、查询失效并非 DDL 本身锁表而是 MySQL 5.6 的 MDL元数据锁机制导致DDL 执行前需获取表的MDL 排他锁X 锁而普通读写操作会持有MDL 共享锁S 锁X 锁与任何锁互斥若执行 DDL 时表上存在未提交长事务、慢查询、空闲长连接持有 S 锁未释放DDL 会进入Waiting for table metadata lock状态MySQL 5.6 的 MDL 锁等待为阻塞式且无超时机制后续所有读写请求包括新的 SELECT都会排队阻塞表现为 “表被锁、查询失效”。2.4 耗时非线性的核心原因72 万行表 203 秒的测试结果无法线性推算 2000 万行表耗时因 MySQL 5.6 执行优化后的 DDL 时单位行耗时会随数据量增大而降低大表支持批量块拷贝能充分发挥磁盘连续 IO 优势减少寻道时间大表处理过程中InnoDB 缓冲池缓存命中率更高减少物理 IO 次数小表数据分散存在部分随机 IO调度和 IO 开销相对更高。三、适配 MySQL 5.6 的最优 DDL 语句针对 2000 万行表、BIGINT 类型、默认值 0 的需求结合 MySQL 5.6 的优化特性确定最优 DDL 语句显式指定所有属性以最大化触发优化ALTER TABLE 表名ADD COLUMN 字段名 BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释;语句关键属性说明BIGINT(19)原生数值类型取值范围覆盖超大整数-9223372036854775808~922337203685477580719 为显示宽度匹配有符号最大位数不限制实际取值NOT NULL DEFAULT 0核心优化点简单常量默认值触发 MySQL 5.6 批量赋值优化非空设置避免 NULL 值简化业务代码空值判断显式注释提升表结构可读性便于后续维护。若需新增 VARCHAR 类型字段需显式指定DEFAULT 触发优化ALTER TABLE 表名ADD COLUMN 字段名 VARCHAR(50) DEFAULT COMMENT 注释;四、生产环境无锁落地全流程方案4.1 执行前准备清锁源 低峰期 参数调优核心避坑4.1.1 选择极致低峰期执行建议优先选择凌晨 2:00-4:00或其他业务低峰期减少活跃事务降低 MDL 锁等待概率。4.1.2 强制清理锁源必做避免 MDL 锁等待执行 DDL 前踢掉空闲长连接、终止长事务 / 慢查询释放所有未提交的 S 锁复制代码-- 1. 临时缩短长连接超时时间踢掉空闲连接SET GLOBAL wait_timeout 10;SET GLOBAL interactive_timeout 10;SELECT SLEEP(15); -- 等待15秒让连接自动断开-- 2. 恢复长连接超时默认值8小时SET GLOBAL wait_timeout 28800;SET GLOBAL interactive_timeout 28800;-- 3. 主动终止目标表上的慢查询/长事务替换库名、表名SELECT CONCAT(KILL , id, ;)FROM INFORMATION_SCHEMA.PROCESSLISTWHERE db 数据库名AND info LIKE %表名%AND Time 30AND Command IN (Query, Sleep);-- 执行上述查询生成的KILL语句释放S锁复制代码4.1.3 临时 MySQL 参数调优提速 减少资源竞争可选动态调整参数无需重启DDL 完成后恢复核心优化 DDL 执行效率和 IO 利用率复制代码-- 调大DDL专用缓冲区提升批量拷贝效率默认1M调至16MSET GLOBAL innodb_ddl_buffer_size 16*1024*1024;-- 减少写操作IO开销避免新的长事务SET GLOBAL innodb_flush_log_at_trx_commit 2;-- 调大读写缓冲区缓解缓存竞争SET GLOBAL innodb_read_buffer_size 16*1024*1024;SET GLOBAL innodb_write_buffer_size 8*1024*1024;复制代码4.2 执行中实时监控 状态判断 资源管控4.2.1 核心状态判断确认 MDL 锁获取成功通过SHOW FULL PROCESSLIST;查看 DDL 进程状态脱离锁表风险期的核心标志风险状态State Waiting for table metadata lock未获取 MDL 锁阻塞后续所有读写正常状态State executing 或 State copying to tmp tableMDL 锁已成功获取DDL 无锁执行中二者为 MySQL 5.6 命名差异等效无锁。精准过滤 DDL 进程的查询语句避免翻找SELECT id, command, state, info, timeFROM INFORMATION_SCHEMA.PROCESSLISTWHERE info LIKE %表名%AND command ALTER TABLE;4.2.2 实时资源监控无需持续盯守1 分钟查看 1 次核心指标避免资源耗尽# 监控磁盘IO核心%util为关键指标控制在≤80%iostat -x 1# 监控MySQL的CPU/内存占用top -p pidof mysqld-- 查看InnoDB DDL执行状态确认增量日志同步正常SHOW ENGINE INNODB STATUS\G;4.2.3 读写量突增的应对方案可选若执行期间业务读写量增加IO 利用率 90%无需中断 DDL中断会导致之前的工作白费通过轻量操作缓解资源竞争-- 临时关闭自适应刷新减少后台IOSET GLOBAL innodb_adaptive_flushing OFF;-- 若业务支持临时动态限流Java业务侧开关将QPS限制在日常60%-70%4.3 执行后恢复配置 全维度验证必做4.3.1 恢复 MySQL 默认配置将临时调整的参数恢复默认保证数据库长期运行的性能和数据安全性复制代码-- 恢复DDL缓冲区SET GLOBAL innodb_ddl_buffer_size 1*1024*1024;-- 恢复日志刷盘安全级别保证宕机不丢数据核心SET GLOBAL innodb_flush_log_at_trx_commit 1;-- 恢复读写缓冲区SET GLOBAL innodb_read_buffer_size 1*1024*1024;SET GLOBAL innodb_write_buffer_size 8*1024;-- 恢复自适应刷新SET GLOBAL innodb_adaptive_flushing ON;复制代码4.3.2 DDL 执行成功的全维度验证表结构验证确认新字段属性完全符合预期DESC 表名; -- 快速查看字段属性SHOW CREATE TABLE 表名; -- 精准确认完整定义数据验证确认新字段默认值赋值正常无空值SELECT id, 新增字段名 FROM 表名LIMIT 20; -- 随机查询默认值SELECT COUNT(*) FROM 表名 WHERE 新增字段名 IS NOT NULL; -- 全量验证非空读写验证模拟业务操作确认读写正常UPDATE 表名 SET 新增字段名2 WHERE idxxx; -- 模拟更新INSERT INTO 表名 (id, 新增字段名) VALUES (xxx, 3); -- 模拟插入业务验证观察 Java 多线程业务日志确认无超时、报错、事务回滚等异常。五、关键问题与解决方案汇总核心问题 解决方案 关键要点DDL 执行慢全表拷贝 显式指定简单默认值触发 MySQL 5.6 批量赋值优化 数值类型优化效果优于 VARCHARBIGINT (19) DEFAULT 0 最优线性推算耗时偏差大 无需推算2000 万行表 SSD 磁盘 5-8 分钟机械硬盘 12-18 分钟 大表批量拷贝、缓存命中率高、连续 IO 优势降低单位行耗时MDL 锁等待导致锁表 低峰期执行 清理锁源踢长连接、终止长事务 执行前必做避免 DDL 进入 Waiting for table metadata lock 状态高频读写场景资源竞争 临时参数调优 轻量限流可选 仅引发 IO/CPU 竞争无锁表风险业务延迟轻微波动执行期间读写量突增 监控资源指标 临时降低 IO 刷盘频率 无需中断 DDLMySQL 会自动适配资源优先保障业务DDL 状态判断困难 通过 SHOW FULL PROCESSLIST 查看 State 列 executing/copying to tmp table 为正常无锁状态六、避坑指南绝对禁止的操作禁止在业务高峰期 / 中峰期执行 DDL即使做了调优高峰期 IO 已接近瓶颈会导致业务延迟大幅增加触发超时重试禁止新增 “非空无默认值” 字段MySQL 5.6 会全表逐行初始化2000 万行表耗时数小时且占用大量资源禁止 DDL 等待 MDL 锁时无动于衷MySQL 5.6 MDL 锁无超时需手动终止持锁进程否则会无限阻塞后续所有操作禁止修改 MySQL 参数后不恢复尤其是innodb_flush_log_at_trx_commit2会降低数据持久性宕机可能丢失数据禁止在 DDL 执行中手动中断进程中断会导致之前的拷贝工作白费重新执行需再次获取 MDL 锁耗时翻倍禁止忽略表结构验证DDL 进程消失后必须通过 DESC/SHOW CREATE TABLE 确认字段属性避免定义缺失。七、延伸优化长期解决方案本次实操为 MySQL 5.6 环境的临时最优解若业务侧允许升级至 MySQL 5.7/8.0是处理大表 DDL 的终极方案高版本支持表结构元数据原地修改新增数值类型 / VARCHAR 类型允许空 / 简单默认值字段时仅修改元数据无需全表拷贝2000 万行表耗时毫秒级MDL 锁机制优化支持锁超时、排队机制优化减少锁表概率整体性能提升查询优化、并发控制、锁机制均优于 5.6高频读写表的整体性能提升 30%-50%生态更完善支持 JSON 类型、窗口函数、并行复制等新特性满足业务后续发展需求。升级注意事项升级前全量备份数据库选择低峰期执行主从切换可实现业务无感知升级5.7/8.0 与 5.6 兼容性极高普通业务代码无需修改。八、总结本次 MySQL 5.6 2000 万行高频读写表新增字段的实操核心围绕 **“利用版本特性做优化、规避 MDL 锁机制坑、平衡资源竞争与业务稳定性”展开最终实现了无锁、无业务感知、高效 ** 的落地核心结论如下MySQL 5.6 虽无高版本的元数据原地修改优化但通过显式指定简单默认值可大幅降低 DDL 执行时间是 2000 万行表的最优临时方案锁表的核心根源并非 DDL 本身而是MDL 锁等待 长事务阻塞执行前清理锁源是避坑关键Online DDL 的无锁特性仅存在于MDL 锁获取成功后executing/copying to tmp table 状态此阶段脱离锁表风险后续仅存在资源竞争高频读写场景下执行 DDL无需暂停业务仅需低峰期执行 临时参数调优业务延迟仅为毫秒级→十毫秒级完全无感知抛芈低谱

相关文章:

多租户下的系统业务开发过程探讨痛

一、背景与问题缘起 MySQL 5.6.51 版本下 2000 万行核心业务表开展新增字段操作,需求为新增BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释(因业务实际需要存储大数值关联字段)。 表的核心特性为Java 多线程密集读写,业务请求持续高…...

技术判断力之AI三问涌

认识Pass层级结构 Pass范围从上到下一共分为5个层级: 模块层级:单个.ll或.bc文件 调用图层级:函数调用的关系。 函数层级:单个函数。 基本块层级:单个代码块。例如C语言中{}括起来的最小代码。 指令层级:单…...

文件(内部/外部)存储

Android 文件存储主要分为**内部存储**、**外部存储**(现在叫分区存储)和**其他介质**(如 SD 卡、USB)。理解它们的区别对开发很重要,特别是 Android 10+ 引入的**分区存储**机制。 1. 内部存储 (Internal Storage) 特点:私有、安全、随应用卸载而删除。其他应用和用户…...

从安防到自动驾驶:红外-可见光融合技术落地避坑指南

从安防到自动驾驶:红外-可见光融合技术落地避坑指南 在智能安防和自动驾驶领域,夜间或恶劣天气条件下的视觉感知一直是技术难点。红外与可见光图像融合(IVIF)技术通过结合两种模态的优势——可见光的高分辨率纹理和红外成像的环境…...

比迪丽LoRA部署教程:WSL2+Windows本地GPU环境全适配方案

比迪丽LoRA部署教程:WSL2Windows本地GPU环境全适配方案 你是不是也想在本地电脑上运行AI绘画,生成自己喜欢的动漫角色?特别是像《龙珠》里的比迪丽这样的经典角色,如果能用自己的电脑随时生成,那该多方便。 今天我就…...

MATLAB伯德图进阶:精准标注谐振点与-3dB带宽的实现方法

1. 伯德图基础与谐振点概念解析 伯德图是控制系统工程师最常用的频率特性分析工具之一,它由幅频特性和相频特性两条曲线组成。我第一次接触伯德图是在研究生阶段的自动控制原理课上,当时教授在黑板上画出的那条神奇的曲线,让我对频率响应分析…...

如何用Python+Neo4j构建医疗知识图谱?从数据清洗到因果推断实战

医疗知识图谱实战:用PythonNeo4j实现药品副作用因果推断 在医疗AI领域,知识图谱正成为连接海量医学数据与临床决策的桥梁。当一位患者同时服用多种药物时,如何准确预测潜在的药物相互作用?当流行病学研究发现某种症状与基因突变相…...

忍者像素绘卷企业应用:游戏公司快速产出像素风角色立绘的落地实践

忍者像素绘卷企业应用:游戏公司快速产出像素风角色立绘的落地实践 1. 像素艺术在游戏行业的价值与挑战 像素艺术作为一种独特的视觉风格,近年来在游戏行业迎来了复兴。从独立游戏到3A大作,越来越多的开发者选择用像素风格唤起玩家的怀旧情感…...

Python数据库编程全面指南:从SQL到NoSQL

Python数据库编程全面指南:从SQL到NoSQL 1. 背景介绍 数据库是现代应用程序的核心组件之一,用于存储和管理数据。Python作为一种广泛使用的编程语言,提供了丰富的库和工具来与各种数据库进行交互。本文将全面介绍Python数据库编程&#xff0c…...

从零搭建Chiplet系统?保姆级梳理UCIe实战中的那些“坑”:Sideband流控、时钟门控与多模块链路

从零搭建Chiplet系统:UCIe实战中的关键挑战与解决方案 在半导体行业追求更高性能、更低功耗的今天,Chiplet技术已成为突破传统单芯片设计瓶颈的重要路径。作为连接不同Chiplet的"桥梁",UCIe(Universal Chiplet Interconnect Expres…...

Qt窗口管理:深入解析close与hide函数的应用场景与性能影响

1. Qt窗口管理基础:理解close与hide的核心差异 刚开始接触Qt开发时,我也曾被close()和hide()这两个看似相似的函数搞糊涂过。直到有次在项目中错误使用了close()导致整个界面崩溃,才真正意识到它们的本质区别。简单来说,hide()就像…...

如何用交换机命令行创建 VLAN(轻松秒懂)

第一步:进入配置模式刚连上交换机时,你只能看状态、不能改配置,就像只能看电视不能换台一样。只有输入这条命令,才能进入设置模式,获得修改配置的权限:system-view第二步:创建 VLAN我们以最常见…...

三步解锁Cursor Pro功能:免费体验AI编程助手完整能力

三步解锁Cursor Pro功能:免费体验AI编程助手完整能力 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tria…...

SEO检测工具有哪些_使用SEO检测工具需要注意哪些事项

SEO检测工具有哪些 在当前的互联网市场中,SEO(搜索引擎优化)是提高网站流量和品牌知名度的关键手段之一。为了帮助网站达到最佳的SEO效果,SEO检测工具应运而生。市场上有哪些可靠的SEO检测工具呢?常见的有Ahrefs、SEM…...

智能提取码工具:重新定义百度网盘资源获取效率

智能提取码工具:重新定义百度网盘资源获取效率 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字化时代,百度网盘已成为重要的资源分享平台,但提取码验证常常成为资源获取的瓶颈。智能提…...

别再乱用ref和reactive了!Vue3响应式API实战避坑指南(附代码对比)

Vue3响应式API深度解析:从原理到实战的避坑指南 在Vue3的日常开发中,ref和reactive这两个响应式API的使用频率极高,但许多开发者在使用过程中常常陷入各种"陷阱"。本文将深入剖析它们的底层机制,并通过实际案例展示如何…...

AI Agent Harness Engineering 在电商场景中的购物助手实践

AI Agent Harness Engineering 全链路实战:从0到1打造懂你的「超级电商购物助手」 1. 标题 (Title) 以下是针对本次主题的5个核心标题,覆盖了新手入门友好、技术深度拆解、业务价值落地三个不同的传播切入点: 新手入门:AI Agent Harness Engineering 全链路实战——从0到1…...

2026届最火的五大降重复率助手解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 为了达成降低文本的AIGC特征的目的,需要从词汇、句法以及结构这三个方面开展优化…...

AI 编程盛行的时代,为什么 “『DC- WFW』” 仍然具有必要性?共

这&#xff0c;是一个采用C精灵库编写的程序&#xff0c;它画了一幅漂亮的图形&#xff1a; 复制代码 #include "sprites.h" //包含C精灵库 Sprite turtle; //建立角色叫turtle void draw(int d){for(int i0;i<5;i)turtle.fd(d).left(72); } int main(){ …...

3分钟解决魔兽争霸3卡顿难题:WarcraftHelper优化工具全攻略

3分钟解决魔兽争霸3卡顿难题&#xff1a;WarcraftHelper优化工具全攻略 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 您是否也曾在重温《魔兽争霸3》…...

振动力学实战:如何用MATLAB模拟无阻尼多自由度系统的受迫振动(附完整代码)

振动力学实战&#xff1a;MATLAB频域分析全流程与工程避坑指南 当一座斜拉桥在特定风速下出现异常振动&#xff0c;或是精密仪器因环境微振动导致测量失准&#xff0c;背后往往隐藏着多自由度系统的动力学奥秘。作为机械与土木工程师&#xff0c;掌握无阻尼多自由度系统的频域分…...

元域的演进式架构:从“大而全”陷阱到“城市扩展”式敏捷构建

摘要 很多企业在构建数字化平台时&#xff0c;陷入“大而全”的陷阱&#xff1a;试图一次性设计所有功能&#xff0c;结果项目周期漫长、成本高昂、上线即落后。元域的建设同样面临这一风险。本文提出元域的演进式架构&#xff0c;以模块化、插件化、事件驱动、配置驱动四大设…...

Transformer算子实现及高阶可视化

支持&#xff1a; 输入任意源句子 / 目标句子任意 head 数任意层数任意 d_model / d_ffencoder self-attentiondecoder masked self-attentioncross-attention逐层热力图输出逐层逐帧动画输出&#xff08;GIF / MP4&#xff09; 下载脚本&#xff1a; transformer_attention_…...

微信聊天记录安全备份与全平台管理指南:从数据危机到永久保存

微信聊天记录安全备份与全平台管理指南&#xff1a;从数据危机到永久保存 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你的微信数据正面临哪些隐形风险&#xff1f; …...

机械设备出口单证操作全攻略

# 【外贸干货】机械设备出口单证操作全攻略&#xff1a;新手必看的报关、信用证、原产地证实操指南 ## 前言 做机械外贸&#xff0c;产品谈好了、合同签了&#xff0c;接下来最让新手头疼的就是单证操作。 报关单填错了&#xff0c;货物被扣&#xff1b;信用证软条款没发现&…...

C/C++ Socket网络编程 介绍

前言&#xff1a;对于C/C初学者来说&#xff0c;网络编程似乎是一道"门槛"&#xff0c;而Socket就是打开这扇门的钥匙。今天我们一起来看看如何入门Socket网络编程。 目录 一、什么是Socket 二、Socket编程流程 三、TCP Socket编程示例 四、一些注意事项 一、什么…...

FramePack深度解析:如何利用下一代帧预测技术创作高质量AI舞蹈视频

FramePack深度解析&#xff1a;如何利用下一代帧预测技术创作高质量AI舞蹈视频 【免费下载链接】FramePack Lets make video diffusion practical! 项目地址: https://gitcode.com/gh_mirrors/fr/FramePack FramePack是一款革命性的视频扩散神经网络框架&#xff0c;它通…...

leetcode 1636. 按照频率将数组升序排序-耗时100-Sort Array by Increasing Frequency

Problem: 1636. 按照频率将数组升序排序- Sort Array by Increasing Frequency 耗时100%&#xff0c;哈希表统计频次&#xff0c;然后频次和数字放入数组&#xff0c;按照题意的规则排序&#xff0c;最后得到最终的数组 Code class Solution { public:int ump[201];vector<…...

AutoGLM-Phone-9B功能体验:实测语音指令控制与图像识别

AutoGLM-Phone-9B功能体验&#xff1a;实测语音指令控制与图像识别 1. 多模态能力初体验 AutoGLM-Phone-9B作为一款专为移动端优化的多模态大模型&#xff0c;其最吸引人的特点莫过于融合了视觉、语音与文本处理能力。在实际测试中&#xff0c;我发现这款模型在资源受限设备上…...

基于CURSOR的APP自动化测试框架实战指南(一)

1. 为什么选择CURSOR搭建APP自动化测试框架 第一次接触APP自动化测试时&#xff0c;我被各种工具和框架搞得晕头转向。直到遇到CURSOR&#xff0c;才发现原来搭建测试框架可以这么简单。CURSOR最大的优势在于它把复杂的配置过程封装成了可视化操作&#xff0c;就像用积木搭房子…...