MySQL8.0 索引底层原理

root@db 12:44: [(none)]> SHOW GLOBAL STATUS LIKE 'INNODB_PAGE_SIZE';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| Innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)

数据页的基础结构为:
图1:

MySQL向系统申请一片连续的内存空间作为缓冲池,默认为128MB,可以通过SHOW VARIABLES LIKE 'INNODB_BUFFER_POOL_SIZE'查看。

root@db 12:45: [(none)]> SHOW VARIABLES LIKE 'INNODB_BUFFER_POOL_SIZE';
+-------------------------+------------+
| Variable_name | Value |
+-------------------------+------------+
| innodb_buffer_pool_size | 2147483648 |
+-------------------------+------------+
1 row in set (0.00 sec)

创建数据页会向该缓冲池申请16KB的空间,同时MySQL以双向链表的形式将数据页管理起来:
图2:

1.2、free链表
MySQL以双链表的形式维护当前处于空闲状态的数据页,该链表称为free链表。

1.3、flush链表
实际上,对表数据进行增删改时,优先修改的是该数据所在数据页的内容,此时被修改的页被称为"脏页面",它们会被添加到flush链表中,适时地被刷新到磁盘上。

1.4、哈希表
记录当前有哪些表的哪些页被缓存到缓冲池中。

1.5、LRU链表
记录常用页(热数据)和不常用页(冷数据)。当缓冲池的数据页不够用时,需要将不常用的页面刷新到磁盘,同时用新数据覆盖它。

除了上面所说的数据页,MySQL中还有其它的页类型,比如:undo日志页、溢出页等。溢出页:当行记录占用内存较大时,该记录需要一个甚至多个单独的页来存储,这样的页称为溢出页

二、索引的底层原理