思考
- 为什么页不能太大,比如16MB?
- 为什么页不能太小,比如16B?
过大的页对于磁盘的读写来说压力非常大,因为页是InnoDB的最小结构,16MB的页,如此之大,就使得读写磁盘对每次磁盘的压力非常大,而每次的浪费非常的大,为什么呢?因为有可能我读那么大的页,读到内存里面就需要一条行数据,读完之后,那么这16兆在内存中就成了垃圾了,因为16M对内存的占用太浪费了。还有就是,16M的页是16M的链表,那么这样就太困难了,还要遍历这个链表。
为什么页不能太小,因为不管机械盘还是SSD的最小读写单位都比较大。
InnoDB中的变长列
- 长度不固定的数据类型:
VARCHAR、VARBINARY、BLOB、TEXT
- 占用空间大于768Byte的不变长类型:
CHAR
比如一个页只存一个行记录,比如存一本小说内容去,那么肯定超出这个页Page了
- 当数据字段过大时,InnoDB会使用行溢出机制
- 行溢出机制会把超长字段放入单独开辟的数据页
也就说,我一个TEXT字段太长了,导致一个数据页存放的行太少,会导致效率问题,当一个行记录太少,就会导致辛辛苦苦从磁盘中读到IO,发现就两条行记录row,都不是我想要的,然后又去磁盘读取,一次IO的开销太大了。所以我们要控制每个行记录的大小。
如:
本来是col1 coln导致row太大,由于页只有16K,所以导致了页只能存一行,B+树就退化了,导致IO的开销非常大。
有一个区域叫做BLOB页,这个区域是有开辟一大片空间的,InnoDB会把超大数据存放在BLOB页中。
页读取的效率是提高了,那查找blob的时候不是还要查找一次IO?是的,这是折中的方案。
InnoDB行记录格式Row Format
- InnoDB行记录格式主要分为两个时代:
- Redundant / Compact(Antelope文件格式)
- Dynamic / Compressed (Barracuda文件格式)
Redundant(冗余的)
Compact
Dynamic
Compressed
- 物理结构上与Dynamic类似









