磁盘数据页的存储结构
特性
- 数据页是按顺序一页一页的存放的,两两相邻的数据页之间会采用双向链表的格式相互引用。
- 数据页内部多个数据行通过主键顺序形成单向链表
- 每个数据页都有一个页目录,根据数据行的主键存放了一个目录,同时数据行是被分散存储到不同的槽位里去的。所以每个数据页的目录里,就是这个页里没个主键跟所在槽位的映射关系。
主键查询
通过传入的主键到页目录中根据主键进行二分查找,通过二分查找在目录中定位到数据的槽位,到对应的槽位遍历每一行数据进行对比
非主键查询
进入数据页里,根据单向链表依次遍历查找数据,性能很差
全表扫描
在没有任何索引数据结构的时候,无论如何查询数据,都是一个全表扫描的过程。根据双向链表依次把磁盘上的数据页加载到缓存页里去,然后在缓存页内部来查找那条数据。
页分裂
数据页中包含了一个起始行,行类型是2;包含了一个行类型为3的结束行(具体可以看03.数据在磁盘上的存储,里面有提到行格式)。其他行都是普通行,类型为0;
当不停的插入数据时,最开始在第一个数据页。当第一个数据页满了,就创建了第二个数据页。但是有时候主键不一定是自增长的,所以会出现第二页中的数据的主键大于第一页中的数据的主键;
为了避免这种情况,在新增一个数据页的时候,会把前一个数据页中主键值较大的,挪动到新的数据页中来。然后把新插入的主键较小的数据挪到上一个数据页中,保证新数据页中的主键值一定比上一个数据页里的主键值大(索引的一个核心基础),这就是页分裂