在Innodb Engine中使用 text 和 blob 数据类型列时。存储在该字段中的值存储在页面外的非页面中(默认的Innodb页面大小为16kb)。
我的问题是 1.页外含义是什么? 2.从页外检索值时如何访问它?
答案 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
;对于某些类型的数据,每个数据都略好一些。LEFT(col, 10)
似乎不必获取额外的页面。我怀疑这种优化缺失了。为什么“离页”有益?
ROW_FORMATs
的部分粗略摘要:
TEXT
/ BLOB
/ VARCHAR
/ VARBLOB
)缩短为40个字节,则会存储在页面上。COMPACT
将在页面上放置768个字节,并向其余部分添加一个20字节的“指针”(这将是页外的)DYNAMIC
或COMPRESSED
,那么只有20字节的指针。 KEY_BLOCK_SIZE
对页面开/关页面有一些影响。
答案 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。他们的价值观是 存储在单链接的溢出页面列表中。