面试八股:MySQL InnoDB 是如何存数据的?

前言

如果你使用过 MySQL 数据库,对它的存储引擎:InnoDB,一定不会感到陌生。

众所周知,在 MySQL5 以前,默认的存储引擎是:MyISAM。但 MySQL5 之后,默认的存储引擎已经变成了 InnoDB,它是我们建表的首选存储引擎。

那么,问题来了:

  1. InnoDB 底层是如何存储数据的?

  2. 表中有哪些隐藏列?

  3. 用户记录之间是如何关联起来的?

如果你想知道上面三个问题的答案,那么,请继续往下面看。

本文主要包含如下内容:

1. 磁盘 or 内存

1.1 磁盘

数据对系统来说是非常重要的东西,比如:用户的身份证、手机号、银行号、会员过期时间、积分等等。一旦丢失,会对用户造成很大的影响。

那么问题来了,如何才能保证这些重要的数据不丢呢?

答案:把数据存在磁盘上。

当然有人会说,如果磁盘坏了怎么办?

那就需要备份,或者做主从了……

好了,打住,这不是今天的重点。

言归正传。

大家都知道,从磁盘上读写数据,至少需要两次 I/O 请求才能完成。一次是读 I/O,另一次是写 I/O。

而IO请求是比较耗时的操作,如果频繁进行 I/O 请求势必会影响数据库的性能。

那么,如何才能解决数据库的性能问题呢?

1.2 内存

把数据存在寄存器?

没错,操作系统从寄存器中读取数据是最快的,因为它离 CPU 最近。

但是寄存器有个非常致命的问题:它只能存储非常少量的数据,设计它的目的主要是用来暂存指令和地址,并非存储大量用户数据的。

这样看来,只能把数据存在内存中了。

因为内存同样能满足我们,快速读取和写入数据的需求,而且性能是非常可观的,只是比较寄存器稍稍慢了一丢丢而已。

不过有个让人讨厌的地方是,内存相对于磁盘来说,是更加昂贵的资源。通常情况下, 500G 或者 1T 的磁盘,是很常见的。但你有听说过有 500G 的内存吗?别人会以为你疯了。内存大小讨论的数量级一般是 16G 或 32G。

内存可以存储一些用户数据,但无法存储所有的用户数据,因为如果数据量太大了,它可能还是存不下。

此外,即使用户数据能刚好存在内存,以后万一有一天,数据库服务器或者部署节点挂了,或者重启了,数据不就丢了?

怎么做,才能不会因为异常情况,而丢数据。同时,又能保证数据的读写速度呢?

2. 数据页

我们可以把一批数据放在一起。

写操作时,先将数据写到内存的某个批次中,然后再将该批次的数据一次性刷到磁盘上。如下图所示:

<

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值