前面写了很多mysql的实用基础知识、接下来我将总结整理一些进阶和更深的一些知识、你知道的越多、不知道就越多、让我们一起学习。
目录
一、buffer pool的位置(Innodb存储引擎内)
二、Buffer Pool是什么?
1、降低磁盘访问的机制
2、Buffer Pool的大小
三、buffer pool的内部缓存了什么
四、Buffer Pool控制块
1、控制块是什么
2、控制块的大小
3、碎片是什么
4、缓存池的预读
五、Buffer Pool页分类和管理
1、页分类(Free Page(空闲页)、Clean Page(干净页)、Dirty Page(脏页))
Free Page(空闲页):
Clean Page(干净页):
Dirty Page(脏页):
2、Buffer Pool管理(LRU链表,free链表,flush链表)
前面4篇、我们从简单的sql语句优化到索引基础、再到索引使用和规则学习和复习一遍。
接下来我们要更深一步的思考、我们原来图上只写了一句查询索引、哪么就有下面这样的问题
1、索引是文件、每次查询都是去文件进行查询吗?(我们都知道IO操作非常消耗性能)
正常情况下查询数据,我们都是先从缓存查,查不到再从数据库查,同样的数据库也不想一直读磁盘,就需要优化、也加个缓存也就是buffer pool了、把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用。
带着问题去学习和复习、保证有效性和记忆性。
先画图
一、buffer pool的位置(Innodb存储引擎内)
我们先看图再引入概念:缓冲池(buffer pool)是Innodb存储引擎内的
二、Buffer Pool是什么?
1、降低磁盘访问的机制
缓冲池(buffer pool)是Innodb存储引擎内一种降低磁盘访问的机制
、通常以页(page)为单位缓存数据。缓存最热的数据页(data page)与索引页(index page),Page页默认大小16K,BP的底层采用链表数据结构管理Page。
2、Buffer Pool的大小
Buffer Pool 是在 MySQL 启动的时候,向操作系统申请的一片连续的内存空间,默认配置下 Buffer Pool 只有 128MB 。
可以通过调整 innodb_buffer_pool_size 参数来设置 Buffer Pool 的大小,一般建议设置成可用物理内存的 60%~80%。
三、buffer pool的内部缓存了什么
Buffer Pool 除了缓存「索引页」和「数据页」,还包括了 锁信息,插入缓存、自适应哈希索引、undo 页等等数据。
在 MySQL 启动的时候,InnoDB 会为 Buffer Pool 申请一片连续的内存空间,然后按照默认的16KB的大小划分出页, Buffer Pool 中的页就叫做缓存页。这些缓存页开始都是空闲页,随着程序的运行,才会有磁盘上的页被缓存到 Buffer Pool 中。
四、Buffer Pool控制块
1、控制块是什么
Buffer Pool中缓存的是数据页,数据页大小跟磁盘默认数据页大小一样(16K),为了更好管理的缓存页产生了一个控制块(描述数据的区域)。
InnoDB 为每一个缓存的数据页都创建了一个单独的区域,记录的数据页的元数据信息,包括数据页所属表空间、数据页编号、缓存页在Buffer Pool中的地址,链表节点信息、一些锁信息以及 LSN 信息等,这个区域被称之为控制块
2、控制块的大小
控制块大概占缓存页大小的5%,16 * 1024 * 0.05 = 819个字节左右
3、碎片是什么
数据页大小为16KB、而控制块的大小819个字节左右、分好所有的控制块与数据页后,可能会有剩余的空间不够一对控制块和缓存页的大小、这个剩余的空间就叫碎片空间。
优化:把Buffer Pool 的大小计算后设置的刚刚好的话,也可能不会产生碎片。
4、缓存池的预读
问:比如我们需要查询一条记录,那么缓冲池就会缓存这一条记录吗?
不知道大家是否还记得局部性原理
局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。
答:整页数据、缓冲池提升IO效率,读取数据时候存在一个局限性原理,即使用一些数据,大概率还会使用它周围的一些数据,因此采用预读机制提前加载,减少未来可能的磁盘IO操作。将页加载到 Buffer Pool 后,再通过页里的页目录去定位到某条具体的记录。
五、Buffer Pool页分类和管理
1、页分类(Free Page(空闲页)、Clean Page(干净页)、Dirty Page(脏页))
Free Page(空闲页):
是在Buffer pool刚初始化时分割空间、生成的一个一个页、此时里面的数据页以及控制块都是空的就是空闲页,位于 Free 链表。
Clean Page(干净页):
表示此页已被使用,但是页面未发生修改,位于LRU 链表。
Dirty Page(脏页):
是缓存的数据发生修改、变更数据和磁盘上的数据不一致,所以是脏缓存页 脏缓存页的数据是要刷到磁盘上的。 当脏页上的数据写入磁盘后,内存数据和磁盘数据一致,那么该页就变成了干净页。脏页同时存在于 LRU 链表和 Flush 链表。
2、Buffer Pool管理(LRU链表,free链表,flush链表)
上面说了三个页的类型、InnoDB也正是通过这三个链表的使用来控制数据页的更新与淘汰的。
我们在下一篇具体写三个链表是如何实现数据页的更新与淘汰。
版权声明:转载请附上文章地址DJyzh的博客_CSDN博客-java基础,框架,java高级领域博主