Mysql的页面外是什么?

vin*_*eth 4 mysql sql database innodb

文本二进制大对象数据类型列在InnoDB引擎使用。该字段中存储的值存储在页面外而不存储在页面中(Innodb页面的默认大小为16kb)。

我的问题是1.离页是什么意思?2.从页外获取值时如何访问它?

Ric*_*mes 5

(继续讲讲rlanvin和fangxing的工作,并更多地谈论问题2。)

ROW_FORMAT控件控制有关“页外”存储哪些列的某些详细信息,以及整个列是否为页外还是仅保留前767个字节之后的部分的某些详细信息。

如果有一部分或全部存储在页外,则会留下20字节的“指针”。这包含多个字段,这些字段具有识别要查找的列值的16KB页面的作用。所有页面均为16KB(假设使用默认值;几乎没有人敢尝试使用不同的页面大小)。因此,一个大列可能占用多个块。

这些块来自“范围”,这是从包含表的“表空间”中获取的1MB(或8MB ??)分配。最初,ibdata*仅注意表空间。后来,有了innodb_file_per_table,表可以在其自己的表空间中。在不久的将来(8.0),您将能够定义表空间并将所需的任何表放入其中。

在执行此操作SHOW TABLE STATUS(并具有file_per_table)时,请注意,它Data_free是4MB,5MB,6MB或7MB,反映了盘区的消耗。

你要去哪里问这个问题?一个方向可能是优化。

  • 如果没有SELECT该列,则不需要访问溢出页面。(注意:这是强烈建议不要盲目使用SELECT *。)
  • 如果可以容纳一些大列,但不能全部容纳,那么一些将存储在页面上;其余的将不在页面内。
  • 有多个ROW_FORMATs; 对于某些类型的数据,每种方法稍好一些。
  • 如果在主页面中保存了767个字节,则似乎LEFT(col, 10)不必获取多余的页面。我怀疑缺少这种优化。
  • 还有更多可能的优化,其中许多未实现。

为什么“页外”有好处?

  • 如果要搜索某些行,则搜索(希望)只能在页面块中进行。
  • 当找到所需的一行(或几行)时,才引起额外的磁盘命中,到达页外块。

以下内容的部分粗略摘要ROW_FORMATs

  • 如果值(TEXT/ BLOB/ VARCHAR/ VARBLOB)短40个字节,它将存储在页面上。
  • 如果该值大于40,但不是很大,则根据是否有足够的空间将其放在页面上还是页面外。也就是说,较大的列将移出页面,直到剩余的列都适合为止。
  • 如果该值确实很大,则将COMPACT在页面上放置768字节,并在其余页面上添加20字节的“指针”(将在页面外)
  • 确实很大,并且DYNAMICCOMPRESSED,则只有20个字节的指针。

KEY_BLOCK_SIZE 对页面上/页面下有一些影响。


rla*_*vin 3

  1. 离页是什么意思

我的意思是它存储在一个单独的区域中,因此它不会使主索引膨胀。这样,页面的大小可以保持相同和精确(其他所有类型所需的确切存储空间是已知的),并且可以更快地访问数据。

  1. 从页外检索值时如何访问它?

存储一个 20 字节的指针,它包含该列其余部分的地址。

附言。我觉得这个问题更适合DBA