大家好,我是热心的大肚皮,皮哥。新年快乐开工大吉。
Buffer Pool
啥是Buffer Pool?
mysql中的数据都在磁盘里,为了提高查询的性能,在mysql服务启动的时候向操作系统申请了一片连续的内存,也是是今天说的buffer pool,默认情况下是128MB。
Buffer Pool什么结构?
为了方便管理,在Buffer Pool中,划分了free链表与flush链表。
Buffer Pool怎么使用呢?
如何在Buffer Pool中定位页数据?
我们怎么去查询某个页的数据呢?如果是采用链表查询,那性能慢死了,如果提高性能,肯定是hash呀,其实可以想下,我们定位的话也是根据表空间号和页号来定位一个页的,也就是表空间号和页号是key,对应的缓冲页地址也就是value,如果有则直接查询,否则从磁盘中加载数据到Buffer Pool中。
如何利用Buffer Pool的提高检索性能?
如何利用Buffer Pool的提高检索性能?其实答案很简单,减少磁盘IO,提升缓存命中率。
首先我们独自思考下,是不是用简单的LRU链表就可以。
第一步LRU的链表思路没有问题,但是有两个尴尬的场景。
场景一是InnoDB人性化的提供了预读的服务。
场景二是全表扫描。
为了解决两个问题,作者则是将这个LRU链表按照一定比例分成两截。默认是3/8。
预读与全表扫描的数据都只会放到冷数据的头部。针对热数据区,进行了进一步的优化,如果每次访问时,都移动节点,开销过大,为了解决这个问题,只有被访问的缓冲页在热数据的1/4的后面时,才会移动到LRU的链表头部。
这就是我们查询mysql时,Buffer Pool的运行过程,当然mysql也可以创建多个Buffer Pool实例,这个大家感兴趣可以看看官网。