数据页。我们都知道,通常在执行crud时,数据页会从磁盘加载到BufferPool的缓存页中。更新缓存页面后,异步线程将数据页面刷新回磁盘。因此,MySQL进行数据操作的最小单位就是数据页。接下来分析分析数据页长什么样子。每个数据页的默认大小为16kb。资料页由多个部分组成,如下图所示:当然,概念那么多,阿星只会挑重点一步步讲,大家不要慌。空闲空间实际上,当数据页还没有被写入时,没有数据行,只有空闲空间。一旦写入,空闲空间就会减少,直到空闲空间用完。具体过程如下:数据页已满,需要开辟新的数据页来存放数据。但是随着数据页数量的增加,他们怎么知道上一页和下一页在哪里呢?双向链表其实在数据页的头部存放了很多信息,比如当前页号、页类型、所属表空间、上一页号、下一页号等。因此,数据页通过上下页码组成一个双向链表,如下图:数据页会逐行存储数据,每行数据会按照页码的大小排序存储主键,每一行数据都有一个指针指向下一行数据,形成单向链表。但这种结构效率不高。如果根据主键ID查询数据,只能进入数据页面,逐条遍历单向链表。所以我们需要添加一些材料来使用二分查找(我不知道什么是二分查找,建议百度,这是最基本的算法)数据页目录是数据页目录的一部分,存放的内容在数据页目录中是主键ID和行。地点。这样就可以通过数据页目录进行二分查找,快速定位到数据页中的数据行。如果只有一个数据页,则没有问题。怎么会有几千个数据页?还是要一个一个的进入数据页,搜索数据页目录。有没有觉得这好像是在做全表扫描?是的,这就是数据库在没有索引的情况下的表现。索引如果没有索引,查询速度可以说是慢得惊人。一般查询不能全表扫描。因此,数据库中的查询必须使用索引来加速。在谈索引之前,我们先谈谈预知。建立索引的核心基础要求下一个数据页的主键值大于上一个数据页的主键值。如果您的主键是自动递增的,则可以保证。一点。但有时主键不是自增的,下一个数据页的主键值可能小于上一个数据页的主键值。为了保证索引的核心基础,有一个交换行数据的过程,称为分页。过程如下:数据页0的id=6行数据移动到数据页1数据页1的页目录更新数据页1的id=3行数据移动到数据页0数据页0的页目录更新主键目录OK,现在我们以主键为例,创建一个主键索引。这个主键索引就是主键目录,会维护所有数据页的最小主键值和对应的页码。有了主键目录的加持,找数据的速度非常快。过程如下:二分查找主键目录,找到对应的数据页并进入数据页,二分查找数据页目录,找到对应的行数据。但是又出现了一个新的问题,表数据库中可能有几百万,几千万,甚至上亿的数据,会有大量的数据页,这就意味着主键目录需要存放大量数据页码和最小主键值。可能主键目录存不下,即使能存,海量数据靠二分查找也会很吃力。所以InnoDB实际上是将主键目录数据存储在多个数据页中。我们称这个数据页为索引页、索引页、索引页。顾名思义,就是存放索引信息的数据页。页面类型来区分。索引页会存放两种内容,一种是最小主键值和索引页码,一种是最小主键值和数据页码。将大量的索引信息分布在多个索引页中,然后将多个索引页组成一个B+树结构,方便二分查找。结构如下图所示:一直说InnoDB的索引是由B+树组成的,其实就是这个意思,当然真正的B+树不是这样长的,这张图是为了帮助大家理解。现在整个查找过程就很简单了,根据主键id二分查找索引页找到对应的索引页,然后二分查找数据页进入数据页,二分查找数据页目录,找到对应的行数据和写到这里就结束了,通过数据页到最后的索引,体验优化过程才是本文的重点。限于篇幅,索引的内容将在后面单独说明。
