图解mysql索引_图解 MySQL InnoDb 存储结构、索引和锁

1.InnoDb 逻辑存储结构图

从InnoDb

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

InnoDb 逻辑存储结构图如下:

a567c0edffca034713ccdf8ba7eb31ec.png

表空间(tablespace)表空间是Innodb存储引擎逻辑的最高层,所有的数据都存放在表空间中。

默认情况下,Innodb存储引擎有一个共享表空间ibdata1,即所有数据都存放在这个表空间中内。

如果启用了innodb_file_per_table参数,需要注意的是每张表的表空间内存放的只是数据、索引、和插入缓冲Bitmap,其他类的数据,比如回滚(undo)信息、插入缓冲检索页、系统事物信息,二次写缓冲等还是放在原来的共享表内的。

段(segment)表空间由段组成,常见的段有数据段、索引段、回滚段等。

InnoDB存储引擎表是索引组织的,因此数据即索引,索引即数据。数据段即为B+树的叶子结点,索引段即为B+树的非索引结点。

在InnoDB存储引擎中对段的管理都是由引擎自身所完成,DBA不能也没必要对其进行控制。

区(extent)区是由连续页组成的空间,在任何情况下每个区的大小都为1MB。

为了保证区中页的连续性,InnoDB存储引擎一次从磁盘申请4~5个区。

默认情况下,InnoDB存储引擎页的大小为16KB,一个区中一共64个连续的区。

页(page)页是InnoDB磁盘管理的最小单位。

在InnoDB存储引擎中,默认每个页的大小为16KB。

从InnoDB1.2.x版本开始,可以通过参数innodb_page_size将页的大小设置为4K,8K,16K。

InnoDB存储引擎中,常见的页类型有:数据页,undo页,系统页,事务数据页,插入缓冲位图页,插入缓冲空闲列表页等。

2.Innodb页结构相关示意图

Innodb页结构单体图

InnoDB数据页由以下7部分组成,如图所示:

13bc5fdc031d04a1b168dbd6db22cace.png

其中File

Header、Page Header、File

Trailer的大小是固定的,分别为38,56,8字节,这些空间用来标记该页的一些信息,如Checksum,数据页所在B+树索引的层数等。User

Records、Free Space、Page Directory这些部分为实际的行记录存储空间,因此大小是动态的。

下边我们用表格的方式来大致描述一下这7个部分:

1bef3de56aa7e79e41c0235ee326d546.png

记录在页中的存储流程图

每当我们插入一条记录,都会从Free

Space部分,也就是尚未使用的存储空间中申请一个记录大小的空间划分到User Records部分,当Free

Space部分的空间全部被User

Records部分替代掉之后,也就意味着这个页使用完了,如果还有新的记录插入的话,就需要去申请新的页了,这个过程的图示如下:

50381d91f27e33336d2c12de2821b11e.png

不同Innodb页构成的数据结构图

一张表中可以有成千上万条记录,一个页只有16KB,所以可能需要好多页来存放数据。不同页其实构成了一条双向链表,File

Header是InnoDB页的第一部分,它的FIL_PAGE_PREV和FIL_PAGE_NEXT就分别代表本页的上一个和下一个页的页号,即链表的上一个以及下一个节点指针。

5a9ed10d28039a11232e3dfccc5caf9f.png

3.Innodb索引结构图

我们先看一份数据表样本,假设Col1是主键,如下:

957b0b2b83fbe4cbe6184e8c479e5e88.png

B+树聚集索引结构图

e3f203880bb578cda8b22f9899b8f0d6.png

聚集索引就是以主键创建的索引

聚集索引在叶子节点存储的是表中的数据

非聚集索引结构图

假设索引列为Col3,索引结构图如下:

58ea7c6a96bbc573cae73a84137de6a6.png

非聚集索引就是以非主键创建的索引

非聚集索引在叶子节点存储的是主键和索引列

使用非聚集索引查询出数据时,拿到叶子上的主键再去查到想要查找的数据。(拿到主键再查找这个过程叫做回表)

假设所查询的列,刚好都是索引对应的列,不用再回表查,那么这个索引列,就叫覆盖索引。

4、InnoDB 锁类型思维导图

c1d31580f25eb4dbf2fcc774df73ddf1.png

加锁机制

乐观锁与悲观锁是两种并发控制的思想,可用于解决丢失更新问题。

乐观锁每次去取数据,都很乐观,觉得不会出现并发问题。

因此,访问、处理数据每次都不上锁。

但是在更新的时候,再根据版本号或时间戳判断是否有冲突,有则处理,无则提交事务。

悲观锁每次去取数据,很悲观,都觉得会被别人修改,会有并发问题。

因此,访问、处理数据前就加排他锁。

在整个数据处理过程中锁定数据,事务提交或回滚后才释放锁.

锁粒度

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值