返回

深入浅出解剖Mysql InnoDB引擎中的页目录

闲谈

页目录与槽

在上一篇文章中,我们介绍了记录在页中按照主键大小顺序串成了单链表。那么,我们使用主键查询的时候,最顺其自然的办法肯定是从第一条记录,也就是 Infimum 记录开始,一直向后找,只要存在总会找到。

问题是,在所有的数据库的组织方式中,基本上都是这么组织的,这必然导致查询时间随着记录数量的增加而增加。虽然可以通过建索引的方式,将数据按索引顺序组织起来,达到快速查找的效果,但是 InnoDB 引擎提供了一种不同的方式来组织数据,这就是页目录

InnoDB中通过页目录来组织索引记录。页目录是一个有序链表,其中每个节点都指向一个槽。槽是一个存储页的链表。页是 InnoDB 引擎中数据存储的最小单位。

页目录中的每个节点都有一个槽指针和一个最大值指针。槽指针指向该节点所指向的槽的第一个页。最大值指针指向该节点所指向的槽中最后一个页中最大的键值。

当 InnoDB 引擎要查询数据时,它会首先检查页目录。如果查询的键值小于页目录中第一个节点的最大值指针,那么 InnoDB 引擎就会从第一个槽开始搜索。如果查询的键值大于页目录中最后一个节点的最大值指针,那么 InnoDB 引擎就会从最后一个槽开始搜索。

InnoDB 引擎会逐个检查槽中的页,直到找到包含查询的键值的页。然后,InnoDB 引擎会从该页开始搜索,直到找到包含查询数据的记录。

页目录的好处

  • 减少搜索时间。 通过使用页目录,InnoDB 引擎可以更快地找到包含查询数据的页。这是因为页目录将索引记录组织成一个有序链表,因此 InnoDB 引擎可以跳过不包含查询数据的页。
  • 提高并发性。 页目录可以提高 InnoDB 引擎的并发性。这是因为页目录允许多个线程同时搜索数据。
  • 减少内存消耗。 页目录可以减少 InnoDB 引擎的内存消耗。这是因为页目录只存储索引记录的指针,而不存储索引记录本身。

页目录的局限性

  • 不适用于所有查询。 页目录只适用于使用主键查询的数据。对于使用其他索引列查询的数据,InnoDB 引擎将无法使用页目录。
  • 可能导致死锁。 如果多个线程同时搜索数据,并且这些线程都持有页目录中的锁,那么可能会导致死锁。

页目录总结

页目录是 InnoDB 引擎中的一种数据结构,它可以帮助 InnoDB 引擎更快地找到包含查询数据的页。页目录通过将索引记录组织成一个有序链表来工作。当 InnoDB 引擎要查询数据时,它会首先检查页目录。如果查询的键值小于页目录中第一个节点的最大值指针,那么 InnoDB 引擎就会从第一个槽开始搜索。如果查询的键值大于页目录中最后一个节点的最大值指针,那么 InnoDB 引擎就会从最后一个槽开始搜索。