本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/80

如果创建表时没有显示的定义主键,mysql会按如下方式创建主键:

  • 首先判断表中是否有非空的唯一索引,如果有,则该列为主键。
  • 如果不符合上述条件,存储引擎会自动创建一个6字节大小的指针。

当表中有多个非空的唯一索引,会选择建表时第一个定义的非空唯一索引。注意根据的是定义索引的顺序,不是创建列的顺序。

InnoDB逻辑存储结构

  • 表空间 tablespace(ibd文件)
  • 段 segment(一个索引2个段)
  • Extent(1MB)
  • Page(16KB)
  • Row
  • Field

表空间

所有数据都放在表空间中。如果开启了innodb_file_per_table选项,则InnoDB会为每张表开辟一个表空间。但是需要注意的是表空间存放的只是数据、索引和插入缓冲bitmap页,其他数据比如undo信息,插入缓冲索引页,系统事务信息,二次写缓冲还是会放在原来的共享表空间内。

如果rollback后,共享表空间不会自动收缩,但是会判断空间是否需要(比如undo空间),如果不需要的话,会将这些空间标记为可用空间,供下次undo使用。

表空间由各个段组成,比如数据段,索引段,回滚段等。

区由连续的页组成,在任何情况下区的大小都是1M。InnoDB存储引擎一次从磁盘申请大概4-5个区。在默认情况下,页的大小为16KB,即一个区中有大概64个连续的页。

InnoDB磁盘管理的最小单位。

  • B树节点= 一个物理Page(16K)
  • 数据按16KB切片为Page 并编号
  • 编号可映射到物理文件偏移(16K * N)
  • B+树叶子节点前后形成双向链表

  • 增删改查之后

    • 有效Node组成双向链表
    • 中间存在空洞
    • 全表扫描时IO可能不连续

关于页的详细结构,参考:MySQL的InnoDB索引原理详解

数据是按行进行存放的。

行记录格式

InnoDB 1.0.x之前:

  • Compact
  • Redundant 为了兼容之前的版本

InnoDB 1.0.x之后

  • Compressed
  • Dynamic

查看行格式的方法,注意row_format字段。

mysql> show table status like 'z'\G;
*************************
Name: z
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 2
Avg_row_length: 8192
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2016-10-
Update_time: 2016-10-
Check_time: NULL
Collation: latin1_s
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

这里不详述各个行格式的格式了,有兴趣的可以看参考资料中的第4章。

行溢出

InnoDB存储引擎可以将数据存储到数据页之外。例如大对象列类型通常会被存放行溢出数据。

对于Compact和Redundant格式,存储形式如下:

先在数据页面保存前768字节的数据,之后保存偏移量,指向行溢出页,也就是Uncompressed BLOB Page。

对于Compressed和Dynamic行格式,采用完全的行溢出方式:

数据页只存放20字节的指针,实际数据存放在off page中。

参考资料:《MySQL技术内幕-InnoDB存储引擎》

InnoDB 逻辑存储结构的更多相关文章

  1. MySQL InnoDB 逻辑存储结构

    MySQL InnoDB 逻辑存储结构 从InnoDB存储引擎的逻辑结构看,所有数据都被逻辑地存放在一个空间内,称为表空间,而表空间由段(sengment).区(extent).页(page)组成.p ...

  2. MYSQL Innodb逻辑存储结构

    转载于网络 这几天在读<MySQL技术内幕 InnoDB存储引擎>,对 Innodb逻辑存储结构有了些了解,顺便也记录一下: 从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放 ...

  3. InnoDB逻辑存储结构

    从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace).表空间又由段(segment).区(extent).页(page)组成.页在一些文档中 ...

  4. InnoDB存储引擎介绍-(5) Innodb逻辑存储结构

    如果创建表时没有显示的定义主键,mysql会按如下方式创建主键: 首先判断表中是否有非空的唯一索引,如果有,则该列为主键. 如果不符合上述条件,存储引擎会自动创建一个6字节大小的指针. 当表中有多个非 ...

  5. InnoDB存储引擎表的逻辑存储结构

    1.索引组织表:     在InnoDB存储引擎中,表都是依照主键顺序组织存放的.这样的存储方式的表称为索引组织表,在innodb存储引擎表中,每张表都有主键.假设创建的时候没有显式定义主键,则Inn ...

  6. InnoDB的表类型,逻辑存储结构,物理存储结构

    表类型 对比Oracle支持的各种表类型,InnoDB存储引擎表更像是Oracle中的索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键,如果在创建 ...

  7. Innodb页面存储结构-2

    上一篇<Innodb页面存储结构-1>介绍了Innodb页面存储的总体结构,本文会介绍页面的详细内容,主要包括页头.页尾和记录的详细格式. 学习数据结构时都说程序等于数据结构+算法,而在i ...

  8. InnoDB表存储结构及keyring加密

    ibdata是InnoDB最重要的系统表空间文件,它记录了InnoDB的核心信息,包括事务系统信息.元数据信息,记录InnoDB change buffer的btree,防止数据损坏的double w ...

  9. innodb的存储结构

    如下所示,innodb的存储结构包含:表空间,段,区,页(块),行 innodb存储结构优化的标准是:一个页里面存放的行数越多,其性能越高 表空间:零散页+段 独立表空间存放的是:数据.索引.插入缓冲 ...

随机推荐

  1. “战术竞技类”外挂打击已开始!揭秘腾讯We Test游戏安全服务新动作!

    商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/353.html We Test导读 国服PUBG的游戏安全将由我 ...

  2. RAC(ReactiveCocoa)使用方法(二)

    RAC(ReactiveCocoa)使用方法(一) RAC(ReactiveCocoa)使用方法(二) 上篇文章:RAC(ReactiveCocoa)使用方法(一) 中主要介绍了一些RAC中常见类的用 ...

  3. (转载)java 枚举 循环遍历以及一些简单常见的使用

    本文转载自:http://blog.csdn.net/qq_27093465/article/details/51706076 作者:李学凯 什么时候想用枚举类型: 有时候,在设计一个java mod ...

  4. 编译虚拟机jvm——openjdk的编译

    java只所以被推广,实际上很大原因是因为本身是跨平台的,很大作用是因为虚拟机的关系. 一般情况下开发人员不需要关注虚拟机内部实现就可以日常开发了,但是有时候涉及到性能的时候就需要了解虚拟机的实现机制 ...

  5. 计算生日是星期几-soj

    编写一个程序,只要输入年月日,就能回答那天是星期几. 输入一个日期,包括年.月.日.(一组测试数据) 输出这个日期是星期几. 输入: 1 1 1 2 1 1 2006 7 10 输出: Monday ...

  6. Unity3D手机斗地主游戏开发实战(04)_出牌判断大小(已完结)

    之前我们实现了叫地主.玩家和电脑自动出牌主要功能,但是还有个问题,出牌的时候,没有有效性检查和比较牌力大小.比如说,出牌3,4,5,目前是可以出牌的,然后下家可以出任何牌如3,6,9. 问题1:出牌检 ...

  7. TCP/IP协议栈 -----链路层

    这节说一下链路层和ARP RARP协议 链路层: 在协议栈中链路层的目的有三个:1. 为IP模块发送或接受数据包 2.为ARP模块发送或接受ARP请求 3. 为RARP模块发送或接受RARP请求. 让 ...

  8. uva 1418 - WonderTeam

    题意:你n支球队进行比赛,每两支队伍之间进行2场比赛,胜得3分,平得1分,输得0分,比赛后挑选出一个梦之队,要求进球总数最多,胜利场数最多,失球总数最少,并且三种都不能与其它对比列第一.问说梦之队的最 ...

  9. UWP ListView下模板宽度问题

    在ListView中模板的宽度默认不会根据listView的宽度改变为改变,这需要更改一下设置,重点在于设置HorizontalContentAlignment的拉伸模式.注意是HorizontalC ...

  10. java日期详解

    [TOC] 一.简介 java中的日期处理一直是个问题,没有很好的方式去处理,所以才有第三方框架的地位比如joda. 文章主要对java日期处理的详解,用1.8可以不用joda. 1. 相关概念 首先 ...