当前位置: 首页 > news >正文

什么是mysql的垂直分表,理论依据是什么,如何使用?

MySQL的垂直分表(Vertical Sharding/Table Splitting)是一种数据库优化技术,通过将一张表中不同字段拆分到多张表中,以解决单表数据量大、访问性能下降的问题。

一、什么是垂直分表?

想象一张user表,包含id(用户ID)、username(用户名)、password(密码)、avatar(头像URL)、bio(个人简介)、address(地址)、contact(联系方式)等20个字段。
其中,idusernamepassword是高频访问字段(如登录时每次都需查询),而avatarbio等是低频访问字段(仅个人主页展示时才用)。

垂直分表就是将这张表按「访问频率」或「字段关联性」拆分为:

  • user_core(核心表):存放idusernamepassword等高频字段;
  • user_profile(资料表):存放avatarbioaddress等低频字段。

两表通过id关联,需要完整信息时通过JOIN查询,日常高频操作仅访问user_core

二、理论依据:数据库访问的「局部性原理」

垂直分表的核心依据是计算机科学中的局部性原理

  • 时间局部性:最近访问过的数据,短期内可能再次被访问(如用户登录时反复查询账号密码);
  • 空间局部性:访问一个数据时,其相邻数据(同表其他字段)可能被一同加载(数据库按「数据页」读取,单表字段越多,每页存储的行数越少)。

当表字段过多时:

  1. 单条记录占用空间大,相同存储容量下能缓存的记录数减少,磁盘IO次数增加;
  2. 高频操作被迫加载大量无关的低频字段,浪费内存和带宽;
  3. 表结构复杂,维护成本高(如新增字段可能影响索引效率)。

垂直分表通过拆分字段,让高频操作仅涉及「小而精」的表,提升缓存利用率和查询效率。

三、如何使用垂直分表?

1. 拆分原则
  • 按访问频率拆分:高频字段(如订单表的order_idstatus)和低频字段(如remarklog)分开;
  • 按字段大小拆分:大字段(如text类型的文章内容、blob类型的图片)单独拆到一张表,避免拖累小字段查询;
  • 按业务关联性拆分:将属于不同业务模块的字段拆分(如用户表中,登录相关字段和社交相关字段拆分)。
2. 实操步骤(以user表为例)
(1)创建拆分后的表
-- 核心表(高频访问)
CREATE TABLE user_core (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,password VARCHAR(100) NOT NULL, -- 加密存储create_time DATETIME NOT NULL,INDEX idx_username (username)
);-- 资料表(低频访问)
CREATE TABLE user_profile (user_id INT PRIMARY KEY, -- 与user_core.id关联avatar VARCHAR(255),bio TEXT,address VARCHAR(255),contact VARCHAR(50),FOREIGN KEY (user_id) REFERENCES user_core(id) ON DELETE CASCADE
);
(2)数据迁移
-- 从原表迁移数据到核心表
INSERT INTO user_core (id, username, password, create_time)
SELECT id, username, password, create_time FROM old_user;-- 迁移到资料表
INSERT INTO user_profile (user_id, avatar, bio, address, contact)
SELECT id, avatar, bio, address, contact FROM old_user;
(3)查询方式
  • 仅需核心信息时(如登录验证):
    SELECT id, username FROM user_core WHERE username = 'test';
    
  • 需要完整信息时(如个人主页):
    SELECT c.*, p.avatar, p.bio 
    FROM user_core c
    LEFT JOIN user_profile p ON c.id = p.user_id
    WHERE c.id = 1;
    
3. 适用场景
  • 表中存在大量低频访问的大字段(如textblob);
  • 高频查询仅用到表中少数字段(如90%的查询只涉及30%的字段);
  • 单表字段过多(超过20个),导致DDL(新增/修改字段)操作缓慢。

四、注意事项

  1. 避免过度拆分:拆分后JOIN操作会增加复杂度,需在「拆分粒度」和「查询效率」间平衡;
  2. 事务一致性:跨表更新时需用事务保证数据一致(如同时修改user_coreuser_profile);
  3. 索引优化:拆分后需重新设计索引(核心表优先优化高频查询的索引)。

垂直分表本质是「空间换时间」,通过合理拆分字段,让数据库资源(内存、IO)更集中于高频操作,从而提升整体性能。

http://www.lryc.cn/news/610807.html

相关文章:

  • 单链表应用实践
  • 【PCIE044】基于 JFM7VX690T 的全国产化 FPGA 开发套件
  • FPGA 基本设计思想--乒乓操作、串并转换、流水线
  • 数学建模算法-day[15]
  • 【MATLAB】(八)矩阵
  • 技术与情感交织的一生 (十一)
  • HTTP 与 HTTPS 的区别深度解析:从原理到实践
  • kettle插件-kettle http post plus插件,轻松解决https post接口无法调用文件流下载问题
  • 攻击实验(ARP欺骗、MAC攻击、报文洪水攻击、DNS欺骗)
  • 在 MCP 中实现 “askhuman” 式交互:原理、实践与开源方案
  • 灰色优选模型及算法MATLAB代码
  • 信息安全概述--实验总结
  • TCP如何实现可靠传输?实现细节?
  • 三极管基本放大电路静态及动态参数计算
  • 原生CSS vs LESS:样式表语言的进化之旅
  • 笔记学习杂记
  • (ZipList入门笔记二)为何ZipList可以实现内存压缩,可以详细介绍一下吗
  • 第19章 枚举器和迭代器 笔记
  • Spring小细节
  • MySQL连接解决:“Host is not allowed to connect to this MySQL server”错误详解
  • HTML总结全览
  • 解决错误nvcc fatal : Unsupported gpu architecture ‘compute_86‘
  • ESOP-3D系统实现机械设备生产流程的可追溯性
  • 人工智能领域、图欧科技、IMYAI智能助手2025年5月更新月报
  • 树状数组的性质
  • AI 对话高效输入指令攻略(四):AI+Apache ECharts:生成各种专业图表
  • C++ ---》string类的模拟实现
  • Solidity智能合约基础
  • 单目云台双摄像头配置双摄像头的优势
  • 深入理解 Android SO 导出符号:机制与安全优化