关于mysql:为啥MySQL的InnoDB在一页page中最少要存储两条记录

34次阅读

共计 1906 个字符,预计需要花费 5 分钟才能阅读完成。

对于这个问题,村长我查过很多信息,有说来自官网,有本人剖析的,无所适从,要么太发散,要么有几分牵强,当初村长试解答一下。

这个问题其实挺有意思,实践上来说,能够存一条数据,那为啥要有这么个规定呢?

咱们晓得,一页的大小默认为 16*1024=16384 字节,然而,MySQL 容许的一行数据的存储下限却为 65535!
当然了,这 65535 个字节除了列自身的数据外,还包含一些其余数据(storage overhead),比方 变长字段长度列表、NULL 值列表、记录头信息 等,但归根结底,还是远大于 16384 的。
如果至多要存储两条记录,简略做个除法,16384/2=8192,这远小于上限值啊!

有意思吧?

如果咱们设置行类型为 text, 实践上会呈现一页可能存不下一行数据的状况誒。
比方,超过 一页大小的二分之一,8192,那怎么办?

这种状况称之为 行溢出,和内存溢出相似

MySQL 是怎么解决行溢出的呢?

这波及到 行格局 问题,MySQL 反对 4 种不同类型的行格局:Compact、Redundant(比拟老)、Dynamic、Compressed。
Compact 和 Redundant 行格局中,记录的实在数据处会存储该列的一部分数据 (前 768 个字节),残余数据存储在其余页(溢出页),再应用 20 个字节存储指向溢出页的地址;
Dynamic(MySQL 默认) 和 Compressed 行格局中,不会在记录的实在数据处寄存前 768 个字节,而是将所有字节都存储在其它页面中,本身只存储一个指向溢出页的地址;略有不同的是,Compressed 行格局会采纳压缩算法对页面进行压缩,以节俭空间。

言而总之,要么存 前缀 + 溢出页地址,要么只存 溢出页地址。

当初问题来了,咱们假如一个场景:

某一行数据,占 10000 个字节,加上额定信息,一页也是能够存下的,为啥非得搞个溢出页寄存,这不给本人找事儿吗?
咱们再持续假如,如果容许寄存一行,且所有数据都是 10000 个字节,那就变成有多少行就有多少页了。

这种状况有啥问题呢?

咱们要晓得,MySQL 是以页作为磁盘和内存之间交互的根本单位的,也就是,个别状况下一次起码从磁盘中读取 16KB 的内容到内存中;
如果咱们执行 select * from tbl, 连个筛选条件也不加,而且是读取全量字段,感觉一页存几条都没啥区别,就是可劲儿造呗;
但理论状况中,千万量级的表,不可能呈现这么傻叉的查问逻辑,别问村长为啥,你本人试试就晓得如许痛的领悟了。

通常来讲,大量级的表,咱们查问数据,个别要设定筛选条件,也就是依据索引来放大查问范畴,以达到只取必要数据的目标;
而造成行溢出的,根本都是 text 或 超长的 varchar 字段,这类字段个别是不会被高频次查问的;
如果有一个学生表,里边有学生 ID、名称、班级、业余等信息,还有一个兴趣爱好的字段,被设定为 text,且大家为了交朋友,都很踊跃填写,兴趣爱好都超过了 10000 个字节,但小于一页数据大小;

当初问题又来了:
MySQL 容许一页存一行数据,一共存了 2000 条学生记录,也就是 2000 页;
大领导来视察了,想查问学生根本信息,不必带上 兴趣爱好 形容啥的,领导没趣味看,就学生本人玩儿的;
假如一次从磁盘读取 16kb,也就是一页数据,那就得从磁盘读取 2000 次吧?
如果记录数扩大为 2000 万 呢?那就得读取 2000 万 次吧?这效率可想而知。。。
但如果限度了一页至多存两条记录呢?你会发现,读取次数间接降了一半誒。

这就是二分逻辑的神奇之处,相似经济学中的 ” 荷塘效应 ”,假如池塘的荷叶一天增长一倍,那在在它铺满池塘之前的前一天,才只占了池塘的一半面积呢。

剖析到这里,都有些心灵鸡汤的玄学滋味了;
这个限度,大概就是为了提前拆散长文本数据,以实现更高效的查问吧;

因为这个限度的存在,保障了极其状况的查问效率能够至多晋升一倍

附:
行格局 小常识延长
MySQL 中,若一张表外面不存在 varchar、text 以及其变形、blob 以及其变形的字段的话,比方只有 int、char 字段,那么这张表其实也叫动态表,即该表的 row_format 是 FIXED;
其特点是:每条记录所占用的字节一样,读取快,但节约额定一部分空间;
反之如果存在,这张表就叫动静表,即该表的 row_format 是 DYNAMIC(当然还包含下面提到的 COMPRESSED、COMPACT 等),就是说每条记录所占用的字节是动静的;
其特点是:节俭空间,但减少读取的工夫开销;
所以,具备频繁检索场景的表,个别都以空间换工夫,将其设计成动态表


参考文档:
https://blog.csdn.net/weixin_39644325/article/details/110587235

正文完
 0