通过阅读本文可以了解什么?
- 磁盘预读概念
- 数据页结构
- innoDb的行格式
- 行溢出
- VARCHAR(65535) 大小的列能不能创建
- 怎么定位到一条数据
- 为什么尽可能设置为非NULL字段
从InnoDB存储引擎的逻辑存储结构来看,所有的数据都被逻辑逻辑的存放在一个空间中,成为表空间。表空间又由 段、区、页组成。本文着重将页和行记录相关的数据
磁盘预读
mysql服务器是我们在生产环境中常用的服务器,大部分的存储引擎数据都是写入到磁盘中的而服务器每次读取数据时会先从pagecache
读取数据,如果pagecache
中没有,需要从磁盘进行读取。
我们知道当我们从磁盘读取数据时,需要经过磁盘寻址加旋转的过程,相对于从缓存中读数据来说是很慢的,所以为了保证数据的读取效率,mysql服务器不是按需读取,而是进行磁盘预读
预读的长度一般为页(page)的整倍数。磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中。
数据页结构
定义
页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据。
InnoDB中的实现
InnoDB中页的大小一般为 16 KB,也就是说,当需要从磁盘中读数据时 每一次最少将从磁盘中读取16KB的内容到内存中,每一次最少也会把内存中的16KB内容写到磁盘中。
默认的页大小为 16KB,每个页中至少存储有 2 条或以上的行记录
从InnoDB 1.2X开始 我们可以通过参数 innodb_page_size
将页的大小设置为4K、8K、16K
页的类别
- 数据页(B-tree Node)
- undo 页 (undo Log Page)
- 系统页 (System Page)
- 事物数据页(Transaction system page)
- 插入缓冲空闲列表页 (Insert Buffer Free List)
- 插入缓冲位图页(Insert Buffer Bitmap)
- 未压缩的二进制大对象页(UnCompresser BLOB Page)
- 压缩的二进制大对象页(Compressed BLOB Page)
查看默认页的大小
SHOW GLOBAL STATUS like 'Innodb_page_size';
页的结构
各模块作用
名称 | 占用空间 | 描述 |
---|---|---|
File Header | 38字节 | 页的一些通用信息 |
Page Header | 56字节 | 数据页专有的一些信息 |
Infimum + Supremum | 26字节</ |