本文同时发表在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. 关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别

    轮播中大多会选择mouseover和mouseout  这个时候是没有任何问题的 但当遇到有css3动画的时候,会发现移入移出过快 动画还没加载完成就需要执行下一个动画,完了动画样式就错乱了. 这时候 ...

  2. TFboy养成记 多层感知器 MLP

    内容总结与莫烦的视频. 这里多层感知器代码写的是一个简单的三层神经网络,输入层,隐藏层,输出层.代码的目的是你和一个二次曲线.同时,为了保证数据的自然,添加了mean为0,steddv为0.05的噪声 ...

  3. 自学python笔记(一)

    一   简介:Python是著名的"龟叔"Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言.其他的就不说了..... python是 ...

  4. A:点排序-poj

    A:点排序 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个点的坐标(x, y),在输入的n个点中,依次计算这些点到指定点的距离,并按照距离进行从小到大排序,并且输出点的坐标 ...

  5. ptrdiff_t 和 size_t

    size_t和ptrdiff_t常常用来指示数组长度. size_t常用于表示数组的大小,可以一般的将他看为 typedef unsigned int size_t,实质是一个无符号整形.包含在头文件 ...

  6. Innodb中的锁

    Innodb中的锁 共享锁和排它锁(Shared and Exclusive Locks)共享锁和排它锁是行级锁,有两种类型的行级锁 共享锁(s lock)允许持有锁的事务对行进行读取操作 排它锁(x ...

  7. JAVA8新特性(一)

    default拓展方法 java8为接口声明添加非抽象方法的实现,也成为拓展方法. public interface Formula { void doSomething(); default voi ...

  8. day1-Python入门

    百度云有关文档资料链接 链接:https://pan.baidu.com/s/1pLighnX 密码:j69s

  9. java web 学习笔记 jsp内置对象

    jsp2 表达式语言的内置对象 使用方式${object.attributename} 或者${object["attributename"]} pageContext pageS ...

  10. svn服务器的搭建与使用二

    转载出处 上一篇介绍了VisualSVN Server和TortoiseSVN的下载,安装,汉化.这篇介绍一下如何使用VisualSVN Server建立版本库,以及TortoiseSVN的使用. 首 ...