乐趣区

关于mysql:MySql-对select是怎么处理的

咱们晓得 MySql 数据是存在磁盘的,也从上一篇文章晓得他是怎么读取磁盘文件的数据。那咱们通过 select 查问数据的时候,就会从磁盘读到 MySql,而后返回给客户端。

咱们能够试想一下,假如有个热数据,咱们每秒须要查 10 次,依照下面的流程,就要查 10 次磁盘,只管有索引的存在,那效率也是很低的,所以 MySql 有一个缓冲池 Buffer Pool,把每次查问的数据寄存在 Buffer Pool 里,前面如果再查这个数据,就间接从 Buffer Pool 里取,就防止了每次从磁盘查找,性能就有了很大的晋升。
在磁盘中,咱们每次查问的时候,会定位到数据页,而后二分查找某一行,在 Buffer Pool 中,他也是相似的,所以咱们查找到某一条数据的时候,他就会把这个数据所在的数据页加载到 Buffer Pool。

把数据页的信息加载到 Buffer Pool 时,咱们称之为缓存页,他也是 16kb,另外每个缓存页还对应着形容数据,这些形容数据包含缓存页的信息(比方地址)、数据页的信息等。咱们假如 Buffer Pool 的大小是 160kb,那他就有 10 个缓存页和 10 个形容数据,所以 Buffer Pool 理论大小会超过 160kb。

当从磁盘读取一个数据页的时候,咱们须要晓得把他放在哪个缓存页里,也须要晓得缓存页的地址,这些信息是存在形容数据里的,所以 MySql 保护了一个双向链表数据结构的 free 链表,当还没有加载数据页的时候,他的构造是这样的(这里形容数据就画了 6 个,以及疏忽了形容数据到缓存页的指向):

当咱们加载一个数据页的时候,会先从 free 链表判断是否还有形容数据,如果有,阐明缓存页还没有满,那就把数据页的信息加载到缓存页中。同时把这个形容信息从 free 链表中移除,而后退出到双向链表数据结构的 LRU 链表。LRU 链表就是会把最新拜访的挪动到头部去。

如果没有,阐明缓存页都有数据了。下面的 LRU 链表作用就在这里体现了,既然缓存页都满了,那必定会淘汰已有的缓存页给新的缓存页,LRU 链表就是把链表最初面的,也就是起码拜访的形容数据对应的缓存页的数据刷入磁盘,而后把这个缓存页给新的数据页。

退出移动版