在深入研究索引之前,先来看看磁盘上的数据文件中的数据页的物理存储结构,因为 后续研究索引的物理存储结构以及使用原理的时候,都是跟数据页的物理存储结构是有很大关联的。
数据库最终所有的数据(包括建的各种表以及表里的数据)都是要存放在磁上的文件里的,然后在文件里存放的物理格式就是数据页,那么大量的数据页在磁盘文件里是怎么存储的呢?
大量的数据页是按顺序一页一页存放的,然后两两相邻的数据页之间会采用 双向链表的格式互相引用,大致看起来如下图所示。
这个图在磁盘文件里到底是怎么弄出来的啊? 其实一个数据页在磁盘文件里就是一段数据,可能是二进制或者别的特殊格式的数据,然后数据页里包 含两个指针,一个指针指向自己上一个数据页的物理地址,一个指针指向自己下一个数据页的物理地 址,大概可以认为类似下面这样。
一个数据页内部会存储一行一行的数据,也就是平时在一个表里插入的一行一行的数据就会存 储在数据页里,然后数据页里的每一行数据都会按照主键大小进行排序存储,同时每一行数据都有指针 指向下一行数据的位置,组成单向链表,如下图。
每个数据页里都会有一个页目录,里面根据数据行的主键存放了一个目录,同时数据行是被分散存 储到不同的槽位里去的,所以实际上每个数据页的目录里,就是这个页里每个主键跟所在槽位的映射关 系,如下图所示。
Q:没有索引的时候,是如何查找数据的?
A:假设根据主键查找一条数据,而且假设那个表总共就一个数据页,那么就太简单了!首先到数据页的页目录里根据主键进行二分查找,找到主键对应的槽位,然后去槽位里遍历槽位里每一行数据,就能快速找到那个主键对应的数据了。
A:如果不跟据主键找的话,那就没办法使用主键的那种页目录来二分查找的,只能进入到数据页里,根据单向链 表依次遍历查找数据了,这就性能很差了。
如果有很多个数据页的话,如果没有索引,无论是根据主键还是非主键查询都性能差因为如果第一个数据页里没有想要的数据,就得从第二个数据页里找,这似乎就是全表扫描了。而且数据页都是加载到buffer pool里了,占内存。最坏的情况下,得把所有数据页里的每条数据都得遍历一遍,才能找到需要的那条数据,那条数据在最后一个数据页的最后面存着,这就是全表扫描了!
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!