主要观点总结
文章详细分析了MySQL在进行DDL变更时,由于单行记录过大以及MySQL的页分裂机制导致的表空间膨胀问题。问题表现为变更后的表存储空间膨胀了几乎100%,同时统计信息出现严重偏差,部分SQL查询出现慢查。文章通过详细分析InnoDB的索引机制、页溢出、页分裂等概念,结合当前DDL变更流程,揭示了问题的根源在于DDL变更流程中的全量数据复制和增量binlog回放并行执行,以及单行记录过大时MySQL页分裂的瑕疵。文章还提出了临时和长期的解决方案,临时解决方案包括在低峰期执行原生DDL语句,长期解决方案是修改DDL变更流程,先执行全量数据复制,再进行增量binlog回放。
关键观点总结
关键观点1: 问题背景
业务同学在OneDBA平台进行DDL变更后,发现SQL慢查,表存储空间膨胀,经分析发现MySQL在B+tree页分裂时遇到单行记录过大时的缺陷。
关键观点2: 索引结构分析
InnoDB表是索引组织表,B+tree索引分为聚集索引和二级索引,所有行数据都存储在聚集索引,二级索引存储字段值和主键。B+tree分为根页、非叶子节点和叶子节点,最小存储单位是页,每个页有一个编号,页内记录按key升序排列。页面分裂和合并机制是动态管理动态数据的核心机制。
关键观点3: 当前DDL变更机制
变更流程包括创建临时表、拷贝全量数据、增量DML临时存储、全量数据复制后应用增量DML日志、切换新旧表。
关键观点4: 表空间膨胀原因
在DDL变更过程中,如果单行记录过大,MySQL的页分裂机制可能导致一个页只存储一条记录,造成表空间膨胀。
关键观点5: 统计信息偏差原因
当一个页只有一条数据时,统计信息会产生严重偏差,导致部分SQL出现慢查。
关键观点6: 临时解决方案
在低峰期执行原生DDL语句,MySQL内部重新整理表空间数据,解决表空间膨胀问题。
关键观点7: 长期解决方案
修改DDL变更流程,先执行全量数据复制,再进行增量binlog回放,避免页分裂问题。
免责声明:本文内容摘要由平台算法生成,仅为信息导航参考,不代表原文立场或观点。
原文内容版权归原作者所有,如您为原作者并希望删除该摘要或链接,请通过
【版权申诉通道】联系我们处理。