MySQL InnoDB 逻辑存储结构html
从InnoDB存储引擎的逻辑结构看,全部数据都被逻辑地存放在一个空间内,称为表空间,而表空间由段(sengment)、区(extent)、页(page)组成。ps:页在一些文档中又称块(block)。node
InnoDB存储引擎的逻辑存储结构大体以下:mysql
1、表空间(table space)sql
表空间分为了两种,这里简单的归纳一下:post
1. 独立表空间:每个表都将会生成以独立的文件方式来进行存储,每个表都有一个.frm表描述文件,还有一个.ibd文件。 其中这个文件包括了单独一个表的数据内容以及索引内容,默认状况下它的存储位置也是在表的位置之中。url
2. 共享表空间: Innodb的全部数据保存在一个单独的表空间里面,而这个表空间能够由不少个文件组成,一个表能够跨多个文件存在,因此其大小限制再也不是文件大小的限制,而是其自身的限制。从Innodb的官方文档中能够看到,其表空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在64TB左右了,固然这个大小是包括这个表的全部索引等其余相关数据。spa
InnoDB把数据保存在表空间内,表空间能够看做是InnoDB存储引擎逻辑结构的最高层。本质上是一个由一个或多个磁盘文件组成的虚拟文件系统。InnoDB用表空间并不仅是存储表和索引,还保存了回滚段、双写缓冲区等。 htm
2、段(segment)对象
表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等。前一篇文章(MySQL InnoDB 索引组织表 & 主键做用)已经介绍了关于InnoDB存储引擎室索引组织(index organized),所以数据即索引,索引即数据。那么数据段即为B+树段叶子节点(Leaf node segment),索引段即为B+树段非索引节点。blog
3、区(extent)
区是由连续的页(Page)组成的空间,在任何状况下每一个区大小都为1MB,为了保证页的连续性,InnoDB存储引擎每次从磁盘一次申请4-5个区。默认状况下,InnoDB存储引擎的页大小为16KB,即一个区中有64个连续的页。 (1MB/16KB=64)
InnoDB1.0.x版本开始引入压缩页,每一个页的大小能够经过参数KEY_BLOCK_SIZE设置为2K、4K、8K,所以每一个区对应的页尾5十二、25六、128.
InnpDB1.2.x版本新增了参数innodb_page_size,经过该参数能够将默认页的大小设置为4K、8K,可是页中的数据不是压缩的。
可是有时候为了节约磁盘容量的开销,建立表默认大小是96KB,区中是64个连续的页。(对于一些小表)
4、页(Page)
页是InnoDB存储引擎磁盘管理的最小单位,每一个页默认16KB;InnoDB存储引擎从1.2.x版本碍事,能够经过参数innodb_page_size将页的大小设置为4K、8K、16K。若设置完成,则全部表中页的大小都为innodb_page_size,不能够再次对其进行修改,除非经过mysqldump导入和导出操做来产生新的库。
innoDB存储引擎中,常见的页类型有:
1. 数据页(B-tree Node)
2. undo页(undo Log Page)
3. 系统页 (System Page)
4. 事物数据页 (Transaction System Page)
5. 插入缓冲位图页(Insert Buffer Bitmap)
6. 插入缓冲空闲列表页(Insert Buffer Free List)
7. 未压缩的二进制大对象页(Uncompressed BLOB Page)
8. 压缩的二进制大对象页 (compressed BLOB Page)
5、行(row)
InnoDB存储引擎是面向列的(row-oriented),也就是说数据是按行进行存放的,每一个页存放的行记录也是有硬性定义的,最多容许存放16KB/2-200,即7992行记录。
如有不恰当之处,还望指教,谢谢!
参考书籍:
[1]. MySQL技术内幕:InnoDB存储引擎