关于对网站建设情况的通报,网站建设zrhskj,重庆活动轨迹公布,网站开发的计划书#x1f91f;致敬读者
#x1f7e9;感谢阅读#x1f7e6;笑口常开#x1f7ea;生日快乐⬛早点睡觉
#x1f4d8;博主相关
#x1f7e7;博主信息#x1f7e8;博客首页#x1f7eb;专栏推荐#x1f7e5;活动信息 文章目录 MySQL分库分表面试题深度解析一、核心概念与…致敬读者
感谢阅读笑口常开生日快乐⬛早点睡觉
博主相关
博主信息博客首页专栏推荐活动信息 文章目录 MySQL分库分表面试题深度解析一、核心概念与适用场景1. 什么是分库分表2. 何时需要分库分表 二、拆分策略详解1. 水平拆分 vs 垂直拆分2. 分片键选择原则3. 常用路由算法 三、分库分表中间件选型四、经典面试题精解1. 如何避免分库分表后的数据倾斜2. 分页查询如何优化3. 分布式ID生成方案对比4. 跨分片JOIN如何解决 五、实战问题解决方案1. 扩容如何平滑进行2. 分布式事务实现3. 热点问题处理 六、架构设计面试要点 文章前言
文章均为学习工作中整理的笔记。如有错误请指正共同学习进步。 MySQL分库分表面试题深度解析 以下内容涵盖分库分表的核心知识点及高频面试题从基础概念到架构设计全面覆盖 一、核心概念与适用场景
1. 什么是分库分表
分库将单个数据库拆分为多个物理数据库如order_db拆为order_db1、order_db2分表将单表数据拆分到多个物理表如user表拆为user_0~user_3核心目的解决单库单表性能瓶颈数据量、并发量、磁盘IO
2. 何时需要分库分表
指标临界值参考典型症状单表数据量≥ 5千万行索引树深度3层查询显著变慢数据库数据总量≥ 1TB备份/迁移耗时4小时单库QPS/TPS≥ 5KCPU持续80%响应时间波动大磁盘IOPS达到硬件上限写延迟100ms 二、拆分策略详解
1. 水平拆分 vs 垂直拆分
维度水平拆分垂直拆分原理按行拆分数据分散存储按列拆分字段分离示例user表按user_id%16分表将user拆为user_base和user_detail优点负载均衡扩展性强冷热分离提升热点数据性能缺点跨分片查询复杂需业务层JOIN
2. 分片键选择原则
离散度高如用户ID、订单号避免数据倾斜业务相关性高频查询条件如按商家分片优化店铺查询禁止用单调递增字段导致写入热点、枚举值分布不均
3. 常用路由算法
算法实现方式适用场景取模分片shard user_id % 64数据均匀分布范围分片user_id 1-100万 → 分片1按时间/ID区间查询一致性哈希虚拟节点环扩容影响小动态扩缩容场景地理位置分片按地区编码路由本地化服务优化 三、分库分表中间件选型
中间件架构模式特点适用场景ShardingSphere客户端代理支持读写分离、分布式事务兼容MySQL协议Java应用强定制化需求MyCat服务端代理可视化配置管理支持跨库JOIN快速接入中小规模系统Vitess服务端代理YouTube开源K8s生态集成好云原生架构ProxySQL数据库代理轻量级专注分库分表读写分离简单拆分需求 选型建议 云环境优先Vitess自建集群选ShardingSphere需要图形化管理用MyCat 四、经典面试题精解
1. 如何避免分库分表后的数据倾斜
解决方案
// 分片键加盐增加离散度
String saltedKey userId _ ThreadLocalRandom.current().nextInt(100);
int shard Math.abs(saltedKey.hashCode()) % shardNum;监控各分片数据量超过均值20%触发告警动态调整路由规则如将大客户单独分片
2. 分页查询如何优化
问题LIMIT 100000,10 需各分片先查100010行再归并 优化方案
二次查询法/* 步骤1各分片查询满足条件的ID */
SELECT id FROM user_{shard} WHERE age 18 ORDER BY id LIMIT 100010;/* 步骤2归并取最小ID范围后精准查询 */
SELECT * FROM user_{shard} WHERE id {last_min_id} LIMIT 10;游标分页 WHERE create_time 2023-01-01 AND id 1000 LIMIT 10
3. 分布式ID生成方案对比
方案实现要点优点缺点Snowflake时间戳机器ID序列号无中心化趋势递增时钟回拨问题Leaf-Segment数据库号段批量分配高QPS无网络开销依赖DBUUID标准RFC4122实现无协调节点无序索引效率低Redis INCR原子操作生成连续ID简单高效持久化丢失风险
4. 跨分片JOIN如何解决
策略
全局表广播小表复制到所有分片如地区码表字段冗余将关联字段存入主表如订单中冗余商品名称业务层组装先查A分片数据再根据ID查B分片合并中间件支持MyCat支持ER分片关联表同组分片 五、实战问题解决方案
1. 扩容如何平滑进行
不停机扩容步骤
双写新老分片同时写入数据同步使用DTS工具全量增量同步灰度切流按user_id范围逐步切流量下线旧节点确保无读流量后停用
2. 分布式事务实现
方案原理适用场景XA两阶段提交数据库原生支持强一致银行转账等金融场景TCC补偿型Try-Confirm-Cancel 业务层实现高并发订单系统Saga事件驱动通过事件序列补偿回滚长事务流程如物流本地消息表数据库消息队列组合最终一致性要求场景
3. 热点问题处理
场景秒杀系统中某商品ID集中访问 解决方案
本地缓存商品数据缓存在应用层请求合并将10ms内请求合并为一次DB查询热点探测JDK Flight Recorder监控热Key分片打散product_id random_suffix 路由 六、架构设计面试要点 拆库不拆表 vs 拆表不拆库 优先拆库解决连接数瓶颈次选拆表解决单表性能问题 分片数规划公式 分片数 峰值数据量 / 单表容量上限 建议预留50%空间如预估3亿数据→分片数3亿/2千万15→取16 数据迁移方案选择 #mermaid-svg-45k6I0qADoZpjNlh {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-45k6I0qADoZpjNlh .error-icon{fill:#552222;}#mermaid-svg-45k6I0qADoZpjNlh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-45k6I0qADoZpjNlh .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-45k6I0qADoZpjNlh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-45k6I0qADoZpjNlh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-45k6I0qADoZpjNlh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-45k6I0qADoZpjNlh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-45k6I0qADoZpjNlh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-45k6I0qADoZpjNlh .marker.cross{stroke:#333333;}#mermaid-svg-45k6I0qADoZpjNlh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-45k6I0qADoZpjNlh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-45k6I0qADoZpjNlh .cluster-label text{fill:#333;}#mermaid-svg-45k6I0qADoZpjNlh .cluster-label span{color:#333;}#mermaid-svg-45k6I0qADoZpjNlh .label text,#mermaid-svg-45k6I0qADoZpjNlh span{fill:#333;color:#333;}#mermaid-svg-45k6I0qADoZpjNlh .node rect,#mermaid-svg-45k6I0qADoZpjNlh .node circle,#mermaid-svg-45k6I0qADoZpjNlh .node ellipse,#mermaid-svg-45k6I0qADoZpjNlh .node polygon,#mermaid-svg-45k6I0qADoZpjNlh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-45k6I0qADoZpjNlh .node .label{text-align:center;}#mermaid-svg-45k6I0qADoZpjNlh .node.clickable{cursor:pointer;}#mermaid-svg-45k6I0qADoZpjNlh .arrowheadPath{fill:#333333;}#mermaid-svg-45k6I0qADoZpjNlh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-45k6I0qADoZpjNlh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-45k6I0qADoZpjNlh .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-45k6I0qADoZpjNlh .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-45k6I0qADoZpjNlh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-45k6I0qADoZpjNlh .cluster text{fill:#333;}#mermaid-svg-45k6I0qADoZpjNlh .cluster span{color:#333;}#mermaid-svg-45k6I0qADoZpjNlh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-45k6I0qADoZpjNlh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 数据一致性高 业务低感知 停机迁移 金融系统 双写迁移 互联网应用 监控关键指标 分片磁盘使用差异率跨分片查询比例最大分片延迟时间 避坑指南 禁止在分片键上使用函数导致路由失效避免全表扫描SELECT * 触发跨分片查询事务中禁止跨库操作XA性能损耗大 掌握以上内容可应对90%的分库分表面试场景。重点展示 “场景分析→技术选型→落地细节” 的全链路思考能力。 文末寄语
关注我获取更多内容。技术动态、实战教程、问题解决方案等内容持续更新中。《全栈知识库》技术交流和分享社区集结全栈各领域开发者期待你的加入。加入开发者的《专属社群》分享交流技术之路不再孤独一起变强。点击下方名片获取更多内容