17. InnoDB-spaceID.PageNumber

表空间内部组织结构

表空间
内部由多个段对象(Segment)组成
每个段(Segment)由区(Extent)组成
每个区(Extent)由页(Page)组成
每个页(Page)里面保存数据(或者叫记录 Row)

  1. 段对用户来说是透明的
  2. 段也是一个逻辑概念
  3. 目前为止在information_schema中无法找到段的概念
  4. 重点需要理解区(Extent)和页(Page)的概念

 

表空间-页

页的定义
  • 页是最小的I/O操作单位
    • data最小的单位不是页,而是页中的记录(Row)
  • 普通用户表中MySQL默认的每个页为16K
    • 从MySQL 5.6开始使用innodb_page_size可以控制页大小
    • 一旦数据库通过innodb_page_size创建完成,则后续无法更改
    • innodb_page_size是针对普通表的,压缩表不受其限制
如何定位到页
  • 每个表空间都对应一个SpaceID,而表空间又对应一个ibd文件,那么一个ibd文件页对应一个SpaceID
    • 因为表空间 <-> ibd文件,表空间 <-> SpaceID,所以ibd文件 <-> SpaceID
    • ibdata1对应的SpaceID为0
    • 每创建一个表空间(ibd文件),SpaceID自增长(全局)
  • PageNumber
    • 在一个表空间中,第几个16K的页(假设innodb_page_size = 16K)即为PageNumber

1. 可以通过( SpaceID , PageNumber )定位到某一个页
2. 在一个 SpaceID (ibd文件)中,PageNumber是唯一且自增的
3. 这里的区(extent)的概念已经弱化。在这个例子中,第一个区的PageNumber是(0~63)且这 64个页在物理上是连续的;第二个区的PageNumber是(64~127)且这64个页在物理上也是连续 的;但是(0~63)和(64~127)之间在物理上则不一定是连续的,因为区和区之间在物理上不一定是连续的。
4. 删除表的时候,SpaceID不会回收,SpaceID是全局自增长的。

root@mysqldb 13:22:  [information_schema]> select * from INNODB_TABLESPACES where space = 19\G
*************************** 1. row ***************************
          SPACE: 19
           NAME: gavin/test_index_2
           FLAG: 16417
     ROW_FORMAT: Dynamic
      PAGE_SIZE: 16384
  ZIP_PAGE_SIZE: 0
     SPACE_TYPE: Single    -- 独立表空间
  FS_BLOCK_SIZE: 4096
      FILE_SIZE: 147456
 ALLOCATED_SIZE: 147456
AUTOEXTEND_SIZE: 0
 SERVER_VERSION: 8.0.36
  SPACE_VERSION: 1
     ENCRYPTION: N
          STATE: normal
1 row in set (0.00 sec)

 

posted @ 2024-04-08 23:22  bingo-HF  阅读(11)  评论(0编辑  收藏  举报