3K字详解MySQL InnoDB 行记录存储结构

前言

工作中我们基本上都是用MySQL的InnoDB存储引擎,但是大家有去了解过它的底层存储结构吗,想必绝大部分人不知道,或者说不知道怎么查相关知识,刚好来看这篇文章就对了!

数据表的文件构成

Mysql的存储行为是由Innodb存储引擎去具体实现的,在windows下安装Mysql后有data(数据库存放的地方)的文件夹,linux一般在/var/lib/mysql文件件。

创建数据库和表后我们可以在data目录先看到数据库对应名称文件夹,文件夹有opt、frm、ibd三种文件:

  • db.opt,用来存储当前数据库的默认字符集和字符校验规则。
  • demo1.frm ,t_order 的表结构会保存在这个文件
  • demo1.ibd,t_order 的表数据会保存在这个文件。表数据既可以存在共享表空间文件(文件名:ibdata1,在data目录下)里,也可以存放在独占表空间文件(文件名:表名字.ibd)

表空间的组成结构

先看图,先对表空间结构做个大概了解,形成一个概念

InnoDB存储引擎中,对段的管理都是由引擎自身所完成,我们已看到段有几种类型,它是不同类型的区组成的集合,一般分为索引段(B+树非叶子节点区)、数据段(B+树非叶子节点区)、回滚段(回滚数据区)。

也就是说InnoDB 对 B+ 树的叶节点和叶子节点进行了区别对待,也就是说叶子节点有自己独有的区,非叶子节点也有自己独有的区,如果不区分叶子节点和非叶子节点,统统把节点代表的页面放到申请到的区中的话,进行范围扫描的效率就大幅降低,而不同的区的集合就组成了不同的段。

我们知道B+树的每一层中的页都会形成一个双向链表,如果是以页为单位来分配存储空间的话,双向链表相邻的两个页之间的物理位置可能不是连续的,也许离得非常远,这种情况下进行 随机I/O 是会很慢的。

因此,应该尽量让链表中相邻的页的物理位置也相邻,这样进行范围查

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值