(继续讲讲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; 对于某些类型的数据,每种方法稍好一些。LEFT(col, 10)不必获取多余的页面。我怀疑缺少这种优化。为什么“页外”有好处?
以下内容的部分粗略摘要ROW_FORMATs:
TEXT/ BLOB/ VARCHAR/ VARBLOB)短40个字节,它将存储在页面上。COMPACT在页面上放置768字节,并在其余页面上添加20字节的“指针”(将在页面外)DYNAMIC或COMPRESSED,则只有20个字节的指针。KEY_BLOCK_SIZE 对页面上/页面下有一些影响。