长沙微信网站公司中国最大的企业培训公司

张小明 2025/12/30 16:03:51
长沙微信网站公司,中国最大的企业培训公司,在线图片制作生成,专业的学校网站建设引言为什么要理解“一行记录是如何存储的”#xff1f;在使用 MySQL 时#xff0c;我们经常会遇到这些问题#xff1a;为什么 VARCHAR 过长会影响性能#xff1f;NULL 字段真的“不占空间”吗#xff1f;为什么 InnoDB 推荐 使用自增主键#xff1f;行溢出#xff08;ro…引言为什么要理解“一行记录是如何存储的”在使用 MySQL 时我们经常会遇到这些问题为什么VARCHAR 过长会影响性能NULL 字段真的“不占空间”吗为什么 InnoDB 推荐使用自增主键行溢出row overflow是怎么发生的BTree 中一行记录到底长什么样这些问题的答案都指向同一个核心MySQL 是如何在磁盘中存储一行数据的要真正理解这些问题我们必须从文件结构 → 表空间 → 页 → 行格式逐层拆解。一、MySQL 的数据到底存放在哪些文件里假设我们有一张表CREATE TABLE t_order ( id BIGINT PRIMARY KEY, user_id BIGINT, amount INT, remark VARCHAR(255) ) ENGINEInnoDB;在磁盘上MySQL 至少会涉及以下文件。2.1 db.opt —— 数据库级别配置文件作用保存数据库默认字符集、排序规则示例内容default-character-setutf8mb4 default-collationutf8mb4_general_ci2.2 t_order.frm —— 表结构定义文件MySQL 8.0 前保存表的结构信息包括字段名、字段类型、索引定义等MySQL 8.0 之后表结构元数据被统一存储到数据字典表中.frm文件逐步退出历史舞台2.3 t_order.ibd —— InnoDB 独立表空间文件重点真正存放数据 索引的地方是t_order.ibd是否生成这个文件取决于一个核心参数。2.4 innodb_file_per_table 参数innodb_file_per_table ON参数值行为ON默认每张表一个.ibd文件OFF所有表共享系统表空间ibdata1生产环境强烈建议 ON原因表可独立回收空间避免 ibdata1 无限膨胀便于迁移与维护二、InnoDB 表空间的物理结构.ibd文件并不是“一坨连续数据”而是有明确层级结构表空间Tablespace └── 段Segment └── 区Extent └── 页Page └── 行Row我们逐层拆解。三、页Page—— InnoDB 的最小存储与 IO 单位4.1 页的基本概念默认大小16KBInnoDB 所有读写都是以页为单位没有“只读一行”这回事至少读一页。4.2 页的类型页类型说明数据页存放行记录索引页BTree 节点Undo 页Undo Log系统页数据字典本文重点关注数据页Index Page。4.3 数据页内部结构简化Page Header Page Directory Infimum Record User Records真实行数据 Supremum Record其中User Records 就是行真正存储的位置。四、段Segment与区Extent5.1 区Extent一个区 64 个连续页默认大小64 × 16KB 1MB作用减少磁盘随机 IO5.2 段SegmentInnoDB 中常见段类型数据段Leaf Segment索引段Non-leaf Segment回滚段Rollback Segment一个 BTree 至少包含两个段五、InnoDB 支持的行格式Row Format6.1 行格式类型行格式说明REDUNDANT老格式已淘汰COMPACT经典格式重点DYNAMIC大字段更友好COMPRESSED压缩存储MySQL 5.7 / 8.0 默认使用 COMPACT / DYNAMIC六、COMPACT 行格式详解重点一条 InnoDB 行在 COMPACT 格式下逻辑结构如下变长字段长度列表 NULL 值列表 记录头信息 真实数据七、为什么大字段7.1 记录的额外信息① 变长字段长度列表逆序存放仅包含VARCHAR / VARBINARY / TEXT 等变长字段按字段定义顺序的逆序存储为什么要逆序因为读取记录时从后向前解析字段更高效避免解析时频繁移动指针有利于 CPU cache 友好访问② NULL 值列表每个可为 NULL 的字段占 1 bit按字段顺序排列如果字段都 NOT NULL则不存在该列表结论NULL 并不是“不占空间”只是占得很少7.2 记录头信息5 字节包含大量重要元信息字段作用delete_mask是否被删除min_rec_mask最小记录标记n_owned分组信息heap_no堆中位置record_type记录类型next_record指向下一条记录链表结构页内行记录是“单向链表”7.3 记录的真实数据存放定长字段INT、BIGINT变长字段的真实内容或溢出指针7.4 隐藏字段非常重要InnoDB 会为每行记录自动添加 3 个隐藏字段字段大小作用DB_ROW_ID6 字节无主键时生成DB_TRX_ID6 字节最近一次修改事务DB_ROLL_PTR7 字节指向 Undo LogMVCC、事务回滚、可见性判断的核心基础可能不直接存储在行内当一行记录过大时InnoDB 会将部分字段存入溢出页Overflow Page行内只保留20 字节左右的指针不同格式策略行格式大字段策略COMPACT尽量行内DYNAMIC更早溢出COMPRESSED压缩后再存总结一行记录的完整存储链路SQL 插入↓InnoDB 表空间.ibd↓段Segment↓区Extent↓页Page16KB↓COMPACT 行结构├─ 变长字段长度列表├─ NULL 值列表├─ 记录头信息├─ 隐藏字段└─ 真实数据
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站如何开启gzip压缩上海最近热点事件

城通网盘直连解析工具:3步获取高速下载链接 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 还在为城通网盘下载速度慢而烦恼吗?ctfileGet这款开源工具能够帮助你在3步内快速获取…

张小明 2025/12/24 6:57:32 网站建设

落地页需要建网站吗网页制作基础教程课件葛艳玲

计算机发展历程:从早期到量子计算 1. 早期计算机的启示 早期的计算工具如计算尺,对于小数字的计算是精确的,但对于大多数大数字的计算则是近似的。在过去,快速得到一个近似结果往往就足够了,因为使用纸笔计算或使用当时珍贵的大型计算机时间来得出更精确的结果,可能需要…

张小明 2025/12/24 6:56:29 网站建设

中国建信网官方网站网站名称重要吗

Python天体力学终极指南:poliastro太空仿真工具完整教程 【免费下载链接】poliastro poliastro - :rocket: Astrodynamics in Python 项目地址: https://gitcode.com/gh_mirrors/po/poliastro 探索宇宙奥秘,计算星际轨迹,现在用Python…

张小明 2025/12/24 6:55:26 网站建设

美食分享网站怎么做手机怎么制作网站

嵌入式软件调试:从基础到高级技巧 1. 远程调试启动配置 在进行远程调试时,需要为目标程序配置不同的调试启动设置。以下是具体步骤: 1. 打开调试配置对话框 :在项目资源管理器视图中选择 measure 项目,通过“运行” - “调试配置” 或点击小虫子图标旁的下拉箭头并…

张小明 2025/12/24 6:53:22 网站建设

做网站客户一般会问什么问题打开链接的网站

Kotaemon RSS订阅集成:实时获取最新资讯并可查询 在信息更新以分钟为单位迭代的今天,一个智能助手如果只能回答“昨天之前”的问题,那它本质上还停留在过去。企业越来越需要能够感知当下、理解趋势、快速响应变化的AI系统——无论是监控行业动…

张小明 2025/12/25 16:34:08 网站建设

代理会计公司网站模版网站开发实践研究报告

AI视频增强技术深度评测:多模型架构分析与性能对比 【免费下载链接】paper2gui Convert AI papers to GUI,Make it easy and convenient for everyone to use artificial intelligence technology。让每个人都简单方便的使用前沿人工智能技术 项目地址…

张小明 2025/12/24 6:50:15 网站建设