思考

  • 为什么页不能太大,比如16MB?
  • 为什么页不能太小,比如16B?

过大的页对于磁盘的读写来说压力非常大,因为页是InnoDB的最小结构,16MB的页,如此之大,就使得读写磁盘对每次磁盘的压力非常大,而每次的浪费非常的大,为什么呢?因为有可能我读那么大的页,读到内存里面就需要一条行数据,读完之后,那么这16兆在内存中就成了垃圾了,因为16M对内存的占用太浪费了。还有就是,16M的页是16M的链表,那么这样就太困难了,还要遍历这个链表。
为什么页不能太小,因为不管机械盘还是SSD的最小读写单位都比较大。

InnoDB中的变长列

  • 长度不固定的数据类型:

VARCHAR、VARBINARY、BLOB、TEXT

  • 占用空间大于768Byte的不变长类型:

CHAR

  • 变长编码下的CHAR

    行溢出数据

  • 由于InnoDB每个数据页容量有限,导致数据字段也是有限的

比如一个页只存一个行记录,比如存一本小说内容去,那么肯定超出这个页Page了
image.png

  • 当数据字段过大时,InnoDB会使用行溢出机制
  • 行溢出机制会把超长字段放入单独开辟的数据页

也就说,我一个TEXT字段太长了,导致一个数据页存放的行太少,会导致效率问题,当一个行记录太少,就会导致辛辛苦苦从磁盘中读到IO,发现就两条行记录row,都不是我想要的,然后又去磁盘读取,一次IO的开销太大了。所以我们要控制每个行记录的大小。
如:
image.png
本来是col1 coln导致row太大,由于页只有16K,所以导致了页只能存一行,B+树就退化了,导致IO的开销非常大。
有一个区域叫做BLOB页,这个区域是有开辟一大片空间的,InnoDB会把超大数据存放在BLOB页中。
image.png
页读取的效率是提高了,那查找blob的时候不是还要查找一次IO?是的,这是折中的方案。

InnoDB行记录格式Row Format

  • InnoDB行记录格式主要分为两个时代:
  • Redundant / Compact(Antelope文件格式)
  • Dynamic / Compressed (Barracuda文件格式)

Redundant(冗余的)

image.png
image.png
image.png
image.png
image.png
image.png

Compact

image.png
image.png
image.png

Dynamic

image.png
image.png

Compressed

  • 物理结构上与Dynamic类似

image.png