什么是Mysql中的页面?

时间:2018-01-17 10:11:41

标签: mysql sql database innodb

在Innodb Engine中使用 text blob 数据类型列时。存储在该字段中的值存储在页面外的非页面中(默认的Innodb页面大小为16kb)。

我的问题是 1.页外含义是什么? 2.从页外检索值时如何访问它?

3 个答案:

答案 0 :(得分:4)

(继续rlanvin和fangxing的开始,并详细说明问题2。)

ROW_FORMAT控制关于哪些列“在页外”存储的一些细节,以及整个列是否在页外或仅在前767字节之后的部分。< / p>

如果在页外存储任何或所有内容,则会留下一个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对页面开/关页面有一些影响。

答案 1 :(得分:2)

  
      
  1. 什么是页外均值
  2.   

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

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

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

PS。我认为这个问题更适合DBA

答案 2 :(得分:0)

来自https://dev.mysql.com/doc/refman/5.5/en/innodb-compression-internals.html

  

在InnoDB表中,BLOB,VARCHAR和TEXT列不属于它们   主键的数据可以存储在单独分配的overflow pages上。我们将这些列称为off-page columns。他们的价值观是   存储在单链接的溢出页面列表中。