Skip to content

面试速答(先看这里)

**一句话结论:**COMPACT 适合处理大量包含可变长度列(如VARCHAR、VARBINARY、BLOB和TEXT类型)的数据。

60秒标准回答:

数据库表的行格式决定了一行数据是如何进行物理存储的,进而影响查询和DML操作的性能

在InnoDB中,常见的行格式有4种

COMPACT 适合处理大量包含可变长度列(如VARCHAR、VARBINARY、BLOB和TEXT类型)的数据

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**数据库表的行格式决定了一行数据是如何进行物理存储的,进而影响查询和DML操作的性能。
  • **要点2:**在InnoDB中,常见的行格式有4种:
  • **要点3:**对于可变长度列,前768字节的数据存储在B树节点的索引记录中,超出部分存储在溢出页中。
  • **要点4:**system, file-per-table, general
  • **要点5:**system, file-per-table, general

**记忆锚点:**COMPACT → DYNAMIC → file-per-table → COMPRESSED → Barracuda → general

关键取舍:

  • 数据库表的行格式决定了一行数据是如何进行物理存储的,进而影响查询和DML操作的性能。
  • DYNAMIC格式适用于大部分的应用场景,并在存储空间和性能上做了一定的平衡。
  • 它的缺点是增加了CPU的使用,可能会降低一些查询的性能。

加分表达:

  • 在存储时,如果发现数据可以通过压缩减小存储空间,就会使用压缩方式来存储数据。

追问准备:

  • 围绕「COMPACT」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「DYNAMIC」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「file-per-table」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

数据库表的行格式决定了一行数据是如何进行物理存储的,进而影响查询和DML操作的性能。

在InnoDB中,常见的行格式有4种:

  1. COMPACT :是MySQL 5.0之前的默认格式,除了保存字段值外,还会利用空值列表保存null值,还会记录变长字段长度列表和记录头信息。

image.png

COMPACT 适合处理大量包含可变长度列(如VARCHAR、VARBINARY、BLOB和TEXT类型)的数据。

> 对于可变长度列,前768字节的数据存储在B树节点的索引记录中,超出部分存储在溢出页中。大于或等于768字节的固定长度列会被编码为可变长度列,并可以存储在页外。

  1. REDUNDANT :Redundant 是 MySQL5.0 版本之前 InnoDB 的行记录存储方式,用的比较少,Redundant 行格式会把该条记录中所有列 (包括隐藏列) 的长度信息都存储到 '字段长度偏移列表' 中。

image.png

  1. DYNAMIC:DYNAMIC格式在MySQL 5.7版本引入,是COMPACT格式的改进版。它保持了COMPACT格式的优点,同时在存储大的可变长度列时更加灵活,能够动态地选择存储在页内或页外。DYNAMIC格式适用于大部分的应用场景,并在存储空间和性能上做了一定的平衡。其结构和COMPACT大致相同;

  2. COMPRESSED:是MySQL 5.1中InnoDB的新特性之一,它可以在存储数据时对数据进行压缩,从而减小磁盘占用空间。它的缺点是增加了CPU的使用,可能会降低一些查询的性能。COMPRESSED 行格式是在 DYNAMIC 行格式的基础上添加了页外压缩功能。在存储时,如果发现数据可以通过压缩减小存储空间,就会使用压缩方式来存储数据。在查询时,会自动解压缩数据并返回结果。

行格式紧凑的存储特性增强的可变长度列存储大索引键前缀支持压缩支持支持的表空间类型所需文件格式
REDUNDANT否否否否system, file-per-table, generalAntelope or Barracuda
COMPACT是否否否system, file-per-table, generalAntelope or Barracuda
DYNAMIC是是是否system, file-per-table, generalBarracuda
COMPRESSED是是是是file-per-table, generalBarracuda