MySQL的垂直分表(Vertical Sharding/Table Splitting)是一种数据库优化技术,通过将一张表中不同字段拆分到多张表中,以解决单表数据量大、访问性能下降的问题。
一、什么是垂直分表?
想象一张user表,包含id(用户ID)、username(用户名)、password(密码)、avatar(头像URL)、bio(个人简介)、address(地址)、contact(联系方式)等20个字段。
其中,id、username、password是高频访问字段(如登录时每次都需查询),而avatar、bio等是低频访问字段(仅个人主页展示时才用)。
垂直分表就是将这张表按「访问频率」或「字段关联性」拆分为:
user_core(核心表):存放id、username、password等高频字段;user_profile(资料表):存放avatar、bio、address等低频字段。
两表通过id关联,需要完整信息时通过JOIN查询,日常高频操作仅访问user_core。
二、理论依据:数据库访问的「局部性原理」
垂直分表的核心依据是计算机科学中的局部性原理:
- 时间局部性:最近访问过的数据,短期内可能再次被访问(如用户登录时反复查询账号密码);
- 空间局部性:访问一个数据时,其相邻数据(同表其他字段)可能被一同加载(数据库按「数据页」读取,单表字段越多,每页存储的行数越少)。
当表字段过多时:
- 单条记录占用空间大,相同存储容量下能缓存的记录数减少,磁盘IO次数增加;
- 高频操作被迫加载大量无关的低频字段,浪费内存和带宽;
- 表结构复杂,维护成本高(如新增字段可能影响索引效率)。
垂直分表通过拆分字段,让高频操作仅涉及「小而精」的表,提升缓存利用率和查询效率。
三、如何使用垂直分表?
1. 拆分原则
- 按访问频率拆分:高频字段(如订单表的
order_id、status)和低频字段(如remark、log)分开; - 按字段大小拆分:大字段(如
text类型的文章内容、blob类型的图片)单独拆到一张表,避免拖累小字段查询;


1056

被折叠的 条评论
为什么被折叠?



