Mysql:简单易懂了解分表

分表有水平分表和垂直分表,下面分别写下这两种方式。

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. 选择策略

优先考虑垂直分表

  1. 表字段超过20个​ → 垂直拆分

  2. 有BLOB/TEXT大字段​ → 分离到单独表

  3. 访问频率差异大​ → 冷热分离

  4. 安全要求高​ → 敏感数据单独存储

需要时考虑水平分表

  1. 单表超过1000万行​ → 水平拆分

  2. 预计未来数据量大​ → 提前规划

  3. 读写性能瓶颈​ → 分散负载

  4. 需要线性扩展​ → 水平分片

黄金法则先垂直,后水平。垂直分表通常能解决80%的性能问题,而且复杂度和风险更低。只有在数据量真正巨大时,才需要考虑水平分表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抹茶苹果梨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值