MySQL 分库分表入门:为什么要分库分表?基础方案
前言单表数据量达到千万级后索引膨胀、查询变慢、备份恢复耗时巨大单纯索引优化无法解决。分库分表是海量数据终极扩容方案分为分表、分库、水平拆分、垂直拆分。一、为什么需要分库分表单表千万级数据BTree 索引层级变深查询 IO 暴涨单库磁盘、CPU、连接数存在硬件上限大批量 DML 操作锁表、锁行冲突严重并发性能差单库备份、恢复耗时极长故障影响范围大。二、两种拆分方案1. 垂直拆分分库按业务模块拆分数据库用户库、订单库、商品库。 优点业务隔离单库压力降低 缺点跨库 JOIN 无法直接执行需要代码关联。2. 水平拆分分表最常用同一业务表按规则拆分多张子表例如订单表拆分为 order_0 ~ order_15。 分片规则按用户 ID 取模分片按时间范围分片按月分订单。三、入门落地中间件Sharding-JDBCJava 客户端分库分表无需额外服务MyCat独立中间件代理层分片多语言项目通用。四、适用与不适用场景需要分库分表订单、日志、流水、用户行为数据单表超 500 万行。不需要分库分表小型后台、管理系统单表百万以内索引优化即可支撑。五、分片常见问题跨分片分页、排序、聚合复杂全局唯一 ID 需要分布式 ID 生成器事务仅支持分片内本地事务跨分片分布式事务成本高。