分表有水平分表和垂直分表,下面分别写下这两种方式。
1. 快速对比
|
维度 |
水平分表 |
垂直分表 |
|---|---|---|
|
拆分方式 |
按行拆分 |
按列拆分 |
|
数据分布 |
数据分散到多张表 |
列分散到多张表 |
|
每张表结构 |
完全相同 |
不同(列不同) |
|
适用场景 |
数据量过大 |
字段过多或冷热分离 |
|
查询变化 |
需要路由到具体表 |
需要跨表关联 |
|
扩展性 |
容易水平扩展 |
有限度扩展 |
2. 水平分表:按行拆分
场景1:数据量过大
-- 原始大表:10亿用户数据
CREATE TABLE users (
id BIGINT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
-- ... 30多个字段
);
-- 水平分表:按用户ID取模分10张表
CREATE TABLE users_0 ( -- 存储id%10=0的用户
id BIGINT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
-- 同样结构创建 users_1 ~ users_9
适用场景:
-
单表数据量超过千万级
-
数据增长迅速,需要未来扩展
-
如:用户表、订单表、日志表
场景2:按时间范围拆分
-- 原始表:5年订单数据
CREATE TABLE orders_2020 (...); -- 2020年数据
CREATE TABLE orders_2021 (...); -- 2021年数据
CREATE TABLE orders_2022 (...); -- 2022年数据
-- 按年分表,便于数据归档
适用场景:
-
时间序列数据
-
需要定期归档旧数据
-
如:日志、监控数据、交易记录
场景3:按地理位置拆分
CREATE TABLE users_beijing (...); -- 北京用户
CREATE TABLE users_shanghai (...); -- 上海用户
CREATE TABLE users_guangzhou (...); -- 广州用户
-- 按业务区域分表,减少跨区域查询
适用场景:
-
多租户SaaS系统
-
地域性强的业务
-
如:外卖、打车、本地服务
水平分表的优缺点
优点:
- 单表数据量可控,提升查询性能
- 易于水平扩展
- 可以并行查询不同分表
缺点:
- 需要路由逻辑(如取模、范围)
- 跨分表查询复杂
- 事务操作困难
- 分片键选择很重要
3. 垂直分表:按列拆分
垂直分表:按列拆分
场景1:字段过多(宽表拆分)
-- 原始宽表:包含用户所有信息
CREATE TABLE user_profile (
id INT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(100),
email VARCHAR(100),
phone VARCHAR(20),
avatar_url VARCHAR(255), -- 不常更新
bio TEXT, -- 个人简介,很少查询
last_login_time DATETIME, -- 频繁更新
login_count INT, -- 频繁更新
settings JSON, -- 设置信息,很少查询
-- ... 还有20多个字段
);
-- 垂直拆分:热数据 + 冷数据
CREATE TABLE user_base ( -- 高频查询和更新
id INT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(100),
email VARCHAR(100),
phone VARCHAR(20),
last_login_time DATETIME,
login_count INT
);
CREATE TABLE user_extended ( -- 低频查询
id INT PRIMARY KEY,
avatar_url VARCHAR(255),
bio TEXT,
settings JSON
);
适用场景:
-
单表字段超过20-30个
-
有明显的冷热数据区分
-
BLOB/TEXT大字段分离
场景2:安全隔离
-- 敏感数据分离
CREATE TABLE user_public ( -- 公开信息
id INT PRIMARY KEY,
username VARCHAR(50),
avatar_url VARCHAR(255),
bio TEXT
);
CREATE TABLE user_private ( -- 私有敏感信息
user_id INT PRIMARY KEY,
password_hash VARCHAR(255),
email VARCHAR(100),
phone VARCHAR(20),
id_card VARCHAR(50)
);
适用场景:
-
GDPR合规要求
-
敏感数据保护
-
权限分级访问
场景3:业务模块分离
-- 电商系统拆分
CREATE TABLE product_basic ( -- 商品基本信息
id INT PRIMARY KEY,
name VARCHAR(200),
price DECIMAL(10,2),
category_id INT,
status TINYINT
);
CREATE TABLE product_detail ( -- 商品详情
product_id INT PRIMARY KEY,
description TEXT,
specifications JSON,
images JSON
);
CREATE TABLE product_statistics ( -- 商品统计
product_id INT PRIMARY KEY,
view_count INT,
sale_count INT,
favorite_count INT,
avg_rating DECIMAL(3,2)
);
适用场景:
-
微服务架构
-
不同团队维护不同模块
-
独立部署需求
垂直分表的优缺点
优点:
- 热数据查询更快(行更小,一页能存更多行)
- 冷热分离,减少IO
- 大字段独立存储
- 便于字段权限控制
缺点:
- 需要JOIN操作
- 事务一致性复杂
- 修改表结构影响多表
4. 选择策略
优先考虑垂直分表
-
表字段超过20个 → 垂直拆分
-
有BLOB/TEXT大字段 → 分离到单独表
-
访问频率差异大 → 冷热分离
-
安全要求高 → 敏感数据单独存储
需要时考虑水平分表
-
单表超过1000万行 → 水平拆分
-
预计未来数据量大 → 提前规划
-
读写性能瓶颈 → 分散负载
-
需要线性扩展 → 水平分片
2万+

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



