innodb是如何一步步插入一条数据的

有情怀,有干货,抖音搜索【黄小姐喜欢编程】关注这个不一样的程序员。

有一线大厂面试完整考点、资料以及我的系列文章。

前言

上周系统上线,发现数据量大的时候查询较慢。经过调查发现,负责该功能的妹妹建表时没有指定主键。

妹妹在被严厉批评后伤心地哭诉:三歪说不要用uuid做主键,我就把uuid删了。

我:傻瓜不让你用uuid做主键,不是不用主键。

看着妹妹悲伤的表情,我语气稍稍缓和,你知道他们为什么不让你用uuid吗?

在我的提问下,她和周围的妹妹们都是语焉不详,一句“会导致写操作慢”就把我打发了。

我丝毫没有生气,我知道这到了我要装逼了时候了,我拉着妹妹们的小手围坐在我周围说道:

这说明你们对mysql的存储结构不了解,我通过向表中插入一条数据来跟大家捋一捋数据库的存储结构。

表空间/Tablespace

假如,我想成为一名文学家,立志写一部长篇巨著,那么就需要把文字记录在纸张上。第一步就是从造纸厂购买两大卷未做裁切的白纸。相应的,在计算机中,所有数据也需要记录在磁盘、磁带、光盘等存储介质上进行长期保存。

这些介质被划分成文件,它们是存储数据的物理空间。

由于我买了两卷纸,而任何一卷都可以存储文字,因此每当我开始下笔时,都费劲心思难以抉择:到底应该记录到哪一卷中?这对于有选择困难症的我来说苦不堪言。

于是,我计划请一个秘书,把要写的内容口述给他,通过他帮我文字誊写到具体的纸卷上,至于到底写在哪一卷上,我无所谓。

同理,用程序操作文件时,首先也需要指定文件路径。可是在数据库中,表是面向开发,而存储设备是面向运维。开发创建表时,很难确定一张表对应哪个文件。而运维也会根据实际情况动态为数据库添加文件。

表与文件的紧耦合严重制约了数据库使用的便利性,于是在文件与表之间增加一层表空间便顺理成章,它向上对接表,向下对接文件;开发者只需在表空间中操作表,而具体存储由Innodb存储引擎根据表空间自动维护。

表空间是InnoDB存储引擎中逻辑结构的最高层,所有数据逻辑上都存储在表空间中。

表空间主要包括以下几种类型:

  • 系统表空间 存储change buffer, doublewrite buffer以及与innodb相关的所有对象的元数据。如:表空间和数据库信息,表结构与字段信息等等。mysql8.0中移除了原先用于存储表结构信息的.frm文件,所有元数据都存储在此系统表空间中。 系统表空间information_schema库中相关的核心视图如下:

假如数据库world中有一张对应表user表,测试如下: 查询表所属表空间信息: select * from information_schema.innodb_tablesp

ace where name='world/user'; (space:表空间id,name:表空间名)

查询表空间对应的数据文件信息: select * from information_schema.files where tablespace_name='world/user'; (file_name:数据文件相对路径)

查询表对应的id: select * from information_schema.innodb_tables where name='world/user';

查询主键索引对应的根节点所在的页号(root page no) select * from information_schema.innodb_indexes where table_id=1269 and name='primary'; (page_no:B+树 root page no; name='primary'表示主键索引)

系统表空间也有对应的数据文件,这个文件默认为(windows下)xxx\MySQL Server 8.0\Data\ibdata1。只有系统表空间可以指定多个文件&

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值