Mysql系列(九)—Mysql表

索引组织表

在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表。如果创建时没有显式的定义主键,那么会有两种策略进行主键的建立。

  1. 首先判断表中是否有非空唯一索引,如果有,则该列为主键。如果有多个,则按照顺序选择第一个为主键,该处的顺序指定义索引时的顺序而不是建表时的顺序。联合索引则不会被选为主键。
  2. 如果不符合条件1,InnoDB自动创建一个6字节大小的指针。

查询隐藏主键则为select _rowid from table

InnoDB逻辑存储结构

从InnoDB存储引擎的逻辑存储结构来看,所有的数据都被逻辑的存放在一个空间中,称为表空间。表空间又由段(segment)、区(extent)、页(page)组成,页也被称为块(block)。Innodb存储引擎的逻辑存储结构大致如下图:

                    

表空间

表空间可以看做是InnoDB逻辑结构存储的最高层,所有的数据存放在表空间中。在默认情况下Innodb存储引擎有一个共享表空间ibdata1,所有的数据都存放在这个表空间内。如果用户启用了innodb_file_per_table参数,则每张表内的数据可以单独放在一个表空间内。需要注意的是,每张表的表空间只存放数据、索引、插入缓冲Bitmap页。其他的数据,例如回滚信息(undo),插入缓冲索引页、系统事务信息、二次写缓冲等还是存放在由来的共享表空间。

表空间由多个段组成,场景的由数据段、索引段、回滚段等。由于InnoDB存储引擎表是索引组织的,因此数据即索引,索引即数据。数据段即为B+树的叶子节点,索引段即为B+树的非索引节点。

区是由连续的页组成的,每个区的大小都为1M。为了保证区中页的连续性,InnoDB存储引擎第一次从磁盘申请4-5个区。默认情况下,InnoDB存储引擎页的大小为16kb,即一个区中一共有64个连续的页.InnoDB1.0.X版本引入压缩页,每个页的大小可能为2k、4k、8k。InnoDB1.2.X版本新增了参数innodb_page_size,通过参数可以将默认页的大小进行调整。上述情况,不管页怎么变化,区的大小总是1M.

在用户启用了参数innodb_file_per_talbe后,创建的表默认大小为96kb。区中是64个连续的页,创建的大小不是应该为1M么?其实这是因为在这个段开始时, 线用32个页大小的碎片页来存放数据,使用完这些页之后才会64个连续页的申请。

页为Innodb磁盘管理的最小单位。如果通过参数innodb_page_size将页的大小设置为4k,8k,16k。若设置完成,那么表中页的大小都为此数值,不允许再改变。除非通过mysqldump导入和导出操作产生新的库。,常见的页类型有:

数据页、undo页、系统也、事务数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页、压缩的二进制大对象页。


Innodb存储引擎是面向列的,也就是说数据是按照行存放的。每个页存放的行记录也是有硬性定义的,最多允许存放16kb/2-200=7992行

表空间及其内部结构说明如下:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值