一文吃透分库分表:从原理到策略,这篇就够了!
一文吃透分库分表从原理到策略这篇就够了1. 为什么需要分库分表1.1 典型痛点场景2. 什么是分库分表2.1 核心概念区分3. 分库分表类型详解含流程图3.1 垂直分表3.2 垂直分库3.3 水平分表3.4 水平分库4. 分库分表策略重点4.1 哈希取模Hash Mod4.2 范围路由Range4.3 一致性哈希Consistent Hashing4.4 标签/枚举路由5. 策略对比总结表6. 实战建议与避坑指南7. 结语The Begin点点关注收藏不迷路⬇ ⬇ 底部 ⬇ ⬇1. 为什么需要分库分表随着业务发展单库单表总会遇到“天花板”。当一张表的数据量达到几千万甚至上亿级别时查询性能会急剧下降索引也变得臃肿不堪。同时单个数据库的连接数、磁盘IO、CPU压力都会成为瓶颈。这时分库分表就成为了MySQL等关系型数据库垂直扩展加硬件之外的水平扩展解决方案。1.1 典型痛点场景单表数据过大超过500万~1000万行B树层级增加IO次数变多。单库连接数爆满应用实例增多数据库连接池不堪重负。写入瓶颈单库写入TPS达到上限磁盘IOPS打满。2. 什么是分库分表分库分表是指将存放在一个数据库或一张表中的数据按照某种规则拆分到多个数据库或多张表中从而分散存储和访问压力。通俗理解一个大柜子装不下所有衣服就把衣服分到多个小柜子里并且每个柜子里还有多个小抽屉。2.1 核心概念区分术语含义解决问题垂直拆分按业务/列拆分解耦业务、减少单表宽度水平拆分按数据行拆分解决单表数据量过大3. 分库分表类型详解含流程图3.1 垂直分表定义将一张字段较多的表按字段访问频率或业务相关性拆成多张表。流程示意原表用户表id, name, age, address, bio, last_login_ip用户主表id, name, age, address用户扩展表id, bio, last_login_ip优点减少跨页查询热点数据更紧凑。利于未来字段扩展。适用场景商品表基础信息、详情描述分开、用户表基本信息扩展信息。3.2 垂直分库定义按业务模块将不同表拆分到不同数据库中。流程示意商品库商品表用户库用户表订单库订单表库存表原单体库订单表用户表商品表库存表优点业务解耦独立部署、独立扩展。不同数据库可用不同硬件/存储引擎。适用场景微服务架构、业务边界清晰的系统。3.3 水平分表核心图必须掌握根据user_id哈希取模用户表 1亿行用户表_00~3千万用户表_13~6千万用户表_26~9千万用户表_39千万~1亿定义同一个数据库内将一张表的数据按某键如ID分散到多张结构相同的表中。优点单表数据量下降索引树高度降低。写压力分散到不同表。缺点跨表查询需聚合如union、分页排序复杂。3.4 水平分库定义将同一业务表的数据分布到不同数据库的同结构表中。流程示意渲染错误:Mermaid 渲染失败: Parse error on line 7: ...uter[分库路由规则hash(order_id) % 3] -----------------------^ Expecting SQE, DOUBLECIRCLEEND, PE, -), STADIUMEND, SUBROUTINEEND, PIPE, CYLINDEREND, DIAMOND_STOP, TAGEND, TRAPEND, INVTRAPEND, UNICODE_TEXT, TEXT, TAGSTART, got PS定义是水平分表 分库的组合数据分布在多个数据库的多张表中。优点突破单库IO、CPU、连接数限制。整体吞吐量线性提升。4. 分库分表策略重点策略就是“怎么决定这一行数据去哪个库哪张表”。4.1 哈希取模Hash Mod公式库序号 hash(sharding_key) % 库数量示例user_id 10001hash后取模4 → 进入库1。user_id 10002→ 进入库2。优点数据分布均匀。缺点扩缩容需要大量数据迁移翻倍扩容可缓解。流程图渲染错误:Mermaid 渲染失败: Parse error on line 2: ...: 123456] -- B[hash(123456)?] B -- -----------------------^ Expecting SQE, DOUBLECIRCLEEND, PE, -), STADIUMEND, SUBROUTINEEND, PIPE, CYLINDEREND, DIAMOND_STOP, TAGEND, TRAPEND, INVTRAPEND, UNICODE_TEXT, TEXT, TAGSTART, got PS4.2 范围路由Range公式按时间或ID区间划分如[1~1亿) → 库0[1亿~2亿) → 库1。优点扩容简单增加新区间范围查询天然支持。缺点容易产生热点最新数据集中写入某个库。4.3 一致性哈希Consistent Hashing定义将哈希值空间组织成圆环0~2^32-1节点均匀分布在环上。数据路由到环上顺时针最近的节点。优点扩容/缩容时只影响少量相邻节点数据迁移。缺点实现复杂虚拟节点需精细控制。示意流程顺时针找顺时针找哈希环 0~2^32Node ANode BNode C用户ID hash用户ID hash4.4 标签/枚举路由按业务枚举值分片如省份华东 → 库0华南 → 库1会员等级VIP → 库0普通 → 库1优点业务语义清晰查询易路由。缺点可能数据倾斜VIP少但活跃高。5. 策略对比总结表策略数据分布扩容难度范围查询支持实现复杂度哈希取模均匀高需迁移差低范围路由可能不均匀低好中一致性哈希较均匀中一般高标签路由自定义低与分片键相关低6. 实战建议与避坑指南能不分就不分优先用缓存、索引、归档历史数据。分库分表键Sharding Key的选择必须查询稳定90%以上查询带该键避免分布式事务尽量让事务内数据在同库避免跨库join设计上做冗余字段如订单表冗余user_name。分页排序难题采用“二次查询法”或Sharding-Sphere等中间件。主流工具ShardingSphere-JDBC轻量级接入简单MyCat代理模式独立部署VitessYouTube出品适合K8s7. 结语分库分表是架构演进的结果而非起点。正确的做法是先单库 → 读写分离 → 垂直拆分 → 水平分库分表理解四种拆分类型垂直分表/库、水平分表/库和四种核心路由策略Hash、Range、一致性Hash、标签你将能从容应对99%的分片设计场景。一句话口诀“垂直按业务分库水平按行去分表哈希均匀范围简一致哈希扩缩好。” 如果本文帮到了你欢迎点赞、收藏、转发让更多人少走弯路本文流程图使用Mermaid语法CSDN支持直接渲染The End点点关注收藏不迷路⬆ ⬆ 顶部 ⬆ ⬆