前面我们已经给大家把MySQL数据库的部分内核原理,更新语句的执行原理,事务原理以及锁原理,都初步的讲给大家听了,同时还穿插了一些相关的数据库性能优化的案例,相信现在大家已经对数据库执行增删改语句的原理有了较为深入的理解了。
接着我们就应该进入比较关键的一个环节,也是很多人期盼的一个环节,就是数据库的索引原理以及查询原理,学完了这块,我们就可以学习大量的实战案例,包括索引设计案例,查询调优案例。
但是今天在深入研究索引之前,我们需要先来看看磁盘上的数据文件中的数据页的物理存储结构,因为后续研究索引的物理存储结构以及使用原理的时候,都是跟数据页的物理存储结构是有很大关联的。
其实之前大家都知道,数据库最终所有的数据(包括我们建的各种表以及表里的数据)都是要存放在磁盘上的文件里的,然后在文件里存放的物理格式就是数据页,那么大量的数据页在磁盘文件里是怎么存储的呢?
首先大家要明白的一点是,大量的数据页是按顺序一页一页存放的,然后两两相邻的数据页之间会采用双向链表的格式互相引用,大致看起来如下图所示:
但是可能有人看到上图就想问了,你画的这个图在磁盘文件里到底是怎么弄出来的啊?
其实一个数据页在磁盘文件里就是一段数据,可能是二进制或者别的特殊格式的数据,然后数据页里包含两个指针,一个指针指向自己上一个数据页的物理地址,一个指针指向自己下一个数据页的物理地址,大概可以认为类似下面这样。
上面那段示例数据,当然不能完全认为是MySQL数据库的磁盘文件里的存储格式,但是我这里就是给你看一些类似的东西,其实MySQL实际存储大致也是类似这样的,就是每个数据页在磁盘文件里都是连续的一段数据。
然后每个数据页里,可以认为是DataPage打头一直到 || 符号的一段磁盘里的连续的数据,你可以认为每一个数据页就是磁盘文件里这么一段连续的东西。
然后每个数据页,都有一个指针指向自己上一个数据页在磁盘文件里的起始物理位置,比如linked_list_pre_pointer=15367,就是指向了上一个数据页在磁盘文件里的其实物理位置,那个15367可以认为就是在磁盘文件里的position或者offset,同理,也有一个指针指向自己下一个数据页的物理位置。
现在你再回头看一下上面那个图,是不是就理解了一个磁盘文件里的多个数据页是如何通过指针组成一个双向链表的
然后一个数据页内部会存储一行一行的数据,也就是平时我们在一个表里插入的一行一行的数据就会存储在数据页里,然后数据页里的每一行数据都会按照主键大小进行排序存储,同时每一行数据都有指针指向下一行数据的位置,组成单项链表,如下图:
好了,今天我们把数据页在磁盘文件里的物理存储结构详细讲解了一下,包括数据页内部的物理存储结构,都讲了一下,接下来参照这个物理结构,就给大家说一下没有索引的时候,是如何查找数据的。