buffer pool是mysql核心组件，是一个内存组件，这块内存大小是默认为128M的，大小可以更改，根据机器配置来改

1 我们开发在平时接触mysql，就是 一个表包括多个行数据，一行包括多个列的数据。但是mysql内部是抽象出数据页来做的，每个数据页放了很多行数据，数据从磁盘加载到buffer  pool中，也是加载数据页的，只不过在buffer pool中的数据页换了一种叫法，
   叫缓存页，一个数据页(缓存页)的大小是16KB，buffer pool中的每个缓存页 都有对应的一个描述信息，这个描述信息存的是数据页所属表空间，数据页编号等信息

  总结一句，表、行和字段是逻辑上的概念 ，是我们平时开发的时候接触到的概念，而表空间、数据区和数据页其实已经落实到物理上的概念了 是mysql内部使用的。



2 数据库一启动 ，就按照我们设定的参数 划出一份内存交给数据库使用，然后数据库就按照划分出一个一个的16KB空的缓存页空间，及若干字节空的描述信息空间，等待磁盘中的数据存进来。
  问题是：怎么才知道这些一块一块的缓存页(描述信息块 后面这两个就作为一个整体了，因为是一一对应关系，不再特别指出) 哪些才是空的呢？ 这个时候就需要使用到free链表了。
  这个链表是个双向的，用于记录buffer pool中的描述数据块的信息， 也就是说：在free链表中存的是空闲数据块信息，让数据库知道哪些缓存页是空闲的(因为缓存页和信息块是一一对应的) 是可以存储数据的。数据库刚启动的时候 buffer pool什么数据都没有，
  那么所有的描述信息块都存在于这个free链表中。 看图中，好像描述信息块在buffer pool和free链表中都存了一份，实际上不是这样的，只是为了画图好理解而已，实际上只有一份 它们之间具有指向关系。

 此外 空闲链表还有一个基础节点，它是连接free链表头节点和尾节点的，它里面还存储了空闲链表的长度，也就是buffer pool中空闲缓存页的个数。
 最后，存数据到buffer  pool中时，先把数据页写到缓存页中去，然后写描述信息，最后再讲描述信息块在free链表中删除节点即可。

猜想：对于连接查询mysql到底什么怎么做的？是先将单表数据存到缓存页中，然后再在buffer pool中做连接查询吗？

3 随着我们对于mysql 做CRUD越来越多了，那么buffer  pool中的数据也就越来越多，越来越复杂了。可能有些数据从磁盘加载到buffer pool中一直被查询使用，可能有些被修改过了，数据和磁盘不一致的，成了脏页。 
后面IO线程在某个时机将修改后的数据刷到磁盘中。那么IO线程是如何知道哪些数据是被修改过 需要被刷盘的呢？ 这个时候就需要flush链表了。

flush链表中存的是被修改的数据页信息，用脏页刷盘。其大概结构和free链表类型，也维护了一个基础节点。

4 随着CRUD越来越多，buffer pool中的缓存页越来越被填满，free链表越来越空。此时我们再从磁盘页刷到缓存页怎么办呢？ 没空间了。

  此时只能淘汰一部分的缓存页，腾出空间来存新数据。此时mysql引入LRU链表来记录缓存页被访问的情况，最近被访问的放到LRU链表前面访问的少的放后面。在缓存页不够用的时候 ，淘汰那些最近最少被使用的缓存页 来存新数据。

上面只是简单的说了一下LRU链表，但是实际上Buffer pool中的LRU远不止这么简单。