分库分表是应对 MySQL 单库单表瓶颈的核心手段,通过拆分数据分散存储和访问压力。本文从拆分维度、实现方式、实践示例到关键挑战进行全面梳理,帮助理解和落地分库分表方案。
一、按拆分维度分类
1. 垂直分表(Column Sharding)
定义
将单表中字段按访问频率和关联性拆分到多个表,各表共享同一主键,业务上属于同一主体。
适用场景
- 单表字段过多(如超过 50 个),查询时加载冗余字段导致 IO 效率低;
- 存在大字段(
text、blob)或低频访问字段,拖慢核心查询; - 字段访问频率差异显著(如用户核心信息 vs 扩展资料)。
优缺点
| 优点 | 缺点 |
|---|---|
| 减少单表字段数,降低 IO 成本 | 需维护多表关联,增加 join 操作 |
| 核心字段与大字段分离,提升查询效率 | 跨表查询增加业务复杂度 |
| 表结构更贴合业务模块 | - |
实践示例
-- 原用户表(字段冗余)
CREATE TABLE `user` (
`id` bigint PRIMARY KEY AUTO_INCREMENT,
`username` varchar(50) NOT NULL, -- 高频
`password` varchar(100) NOT NULL, -- 高频
`age` int, -- 高频
`address` text, -- 低频 + 大字段
`intro` text, -- 低频 + 大字段
`create_time` datetime NOT NULL
);
-- 拆分后:核心信息表(高频访问)
CREATE TABLE `user_core` (
`id` bigint PRIMARY KEY AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`age` int,
`create_time` datetime
);
`user_ext` (
`user_id` ,
`address` text,
`intro` text,
(`user_id`) `user_core`(`id`) CASCADE
);
`user_core` (username, password, age, create_time) (, , , );
`user_ext` (user_id, address, intro) (LAST_INSERT_ID(), , );
c., e.address, e.intro `user_core` c `user_ext` e c.id e.user_id c.username ;


