MySQL 的行溢出是指当一行数据的大小超过了存储引擎规定的最大值时,存储引擎会将该行数据的部分内容存储在另外一个地方,称为行溢出。行溢出通常发生在 BLOB、TEXT 等数据类型的列中,因为这些数据类型的值可以很大,有时会超过存储引擎设置的最大行大小。
MySQL 支持的存储引擎中,InnoDB 和 NDB 存储引擎都支持行溢出。InnoDB 存储引擎的行溢出是通过 BLOB 和 TEXT 列的“非空值”来触发的,即当 BLOB 和 TEXT 列的实际大小大于存储引擎规定的最大大小时,就会触发行溢出。NDB 存储引擎的行溢出则是通过表级别的最大行大小限制来触发的,当一行数据的大小超过该限制时,就会触发行溢出。
底层原理上,行溢出是通过将超出限制的部分存储在一个单独的区域中来实现的。这个区域通常被称为“行溢出页”,由存储引擎自动管理。当数据被插入或更新时,存储引擎会自动将超出限制的部分存储到行溢出页中,并将该数据的引用存储在原始数据行中,以便在需要访问时进行查找和读取。
行溢出可以提高表的存储效率和性能,因为它允许存储引擎只存储数据的一部分,而不是整个数据。但是,行溢出也可能对查询性能产生影响,因为需要访问多个物理位置来检索完整的数据行。因此,在使用行溢出时需要根据具体的场景进行评估和优化。