我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:六合特肖 > 访问局部性 >

缓冲池(buffer pool)这次彻底懂了!!!

归档日期:07-01       文本归类:访问局部性      文章编辑:爱尚语录

  缓存表数据与索引数据,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用。

  (1)缓存访问快,但容量小,数据库存储了200G数据,缓存容量可能只有64G;

  (2)内存访问快,但容量小,买一台笔记本磁盘有2T,内存可能只有16G;

  因此,只能把“最热”的数据放到“最近”的地方,以“最大限度”的降低磁盘访问。

  磁盘读写,并不是按需读取,而是按页读取,一次至少读一页数据(一般是4K),如果未来要读取的数据就在页中,就能够省去后续的磁盘IO,提高效率。

  数据访问,通常都遵循“集中读写”的原则,使用一些数据,大概率会使用附近的数据,这就是所谓的“局部性原理”,它表明提前加载是有效的,确实能够减少磁盘IO。

  (2)预读机制启示了我们,能把一些“可能要访问”的页提前加入缓冲池,避免未来的磁盘IO操作;

  画外音:memcache,OS都会用LRU来进行页置换管理,但MySQL的玩法并不一样。

  最常见的玩法是,把入缓冲池的页放到LRU的头部,作为最近访问的元素,从而最晚被淘汰。这里又分两种情况:

  (1)页已经在缓冲池里,那就只做“移至”LRU头部的动作,而没有页被淘汰;

  (2)页不在缓冲池里,除了做“放入”LRU头部的动作,还要做“淘汰”LRU尾部页的动作;

  如上图,假如管理缓冲池的LRU长度为10,缓冲了页号为1,3,5…,40,7的页。

  七、传统的LRU缓冲池算法十分直观,OS,memcache等很多软件都在用,MySQL为啥这么矫情,不能直接用呢?

  由于预读(Read-Ahead),提前把页放入了缓冲池,但最终MySQL并没有从页中读取数据,称为预读失效。

  (2)新老生代收尾相连,即:新生代的尾(tail)连接着老生代的头(head);

  (1)50只会从老生代头部插入,老生代尾部(也是整体尾部)的页会被淘汰掉;

  (2)假设50这一页不会被真正读取,即预读失败,它将比新生代的数据更早淘汰出缓冲池;

  画外音:但也不要因噎废食,因为害怕预读失败而取消预读策略,大部分情况下,局部性原理是成立的,预读是有效的。*

  当某一个SQL语句,要批量扫描大量数据时,可能导致把缓冲池的所有页都替换出去,导致大量热数据被换出,MySQL性能急剧下降,这种情况叫缓冲池污染。

  虽然结果集可能只有少量数据,但这类like不能命中索引,必须全表扫描,就需要访问大量的页:

  (3)row里的name字段和字符串shenjian进行比较,如果符合条件,加入到结果集中;

  如此一来,所有的数据页都会被加载到新生代的头部,但只会访问一次,真正的热数据被大量换出。

  (3)只有满足“被访问”并且“在老生代停留时间”大于T,才会被放入新生代头部;

  继续举例,假如批量数据扫描,有51,52,53,54,55等五个页面将要依次被访问。

  如果没有“老生代停留时间窗口”的策略,这些批量被访问的页面,会换出大量热数据。

  加入“老生代停留时间窗口”策略后,短时间内被大量加载的页,并不会立刻插入新生代头部,而是优先淘汰那些,短期内仅仅访问了一次的页。

  介绍:配置缓冲池的大小,在内存允许的情况下,DBA往往会建议调大这个参数,越多数据和索引放到内存里,数据库的性能会越好。

  介绍:老生代占整个LRU链长度的比例,默认是37,即整个LRU中新生代与老生代长度比例是63:37。

  介绍:老生代停留时间窗口,单位是毫秒,默认是1000,即同时满足“被访问”与“在老生代停留时间超过1秒”两个条件,才会被插入到新生代头部。

  (3)缓冲池的常见管理算法是LRU,memcache,OS,InnoDB都使用了这种算法;

  在文章缓冲技术中提到无论是单缓冲、双缓冲或循环缓冲,均仅是进程专属缓冲配备,而一旦考虑到操作系统的分时并行特性,任一时刻只有一个进程的缓冲体系在工作之中,而其他进程的缓冲体系并不在工作(要么是迁移到s...博文来自:墨篙和小奶猫

  本人原创文章,转载请注明出处。mysql的内存管理庞大而先进,这在mem0pool.c文件的开头注释中都有说明,粗略的可以分成四部分,包含9大块:bufferpool,parsedandoptimiz...博文来自:cjcl99的博客

  缓冲池体系结构图:缓冲池(BufferPool)是主缓存器的一个区域,用于缓存索引、行的数据、自适应哈希索引、插入缓存(InsertBuffer)、锁还有其他的内部数据结构。BufferPool的大小...博文来自:心有猛虎 细嗅蔷薇

  性能优化:在对象引用之上的对象池化机制在对象引用的实现中,每当一个Buffer实例没有被引用时,则会销毁该对象实例,如被GC回收,但是Buffer对象创建时的内存分配开销是比较大的,如果频繁创建Buf...博文来自:专注于服务端开发的博客

  Flink的网络缓冲池NetworkBufferPool。构造方法需要两个参数,申请的MemorySegment个数和单个MemorySegment的大小,两者乘积是整个内存缓冲池的总容量。内部存储结...博文来自:凤舞九天 音乐工厂 跳舞大碟 带给你

  一、InnoDB缓冲池InnoDB维护一个称为缓冲池的内存存储区域,用于缓存内存中的数据和索引。了解InnoDB缓冲池的工作原理,并利用它来保存内存中经常访问的数据,这是MySQL调优的一个重要方面。...博文来自:jackyrongvip的专栏

  前言缓冲机制是对数据持久化的延迟,减少不必要的IO,提高数据落盘的效率。本文将会详细探讨拥有双Buffer的缓冲池(下文统称TwinsBufferPool)是如何实现的,读者可以依此推广,得到N-Bu...博文来自:文刀的博客天地

  SpawnPool缓冲池带实例Demo运用,unity包,导入后可以直接使用,修改好的,导入不会报错。

  golangsync.pool对象复用并发原理缓存池在gohttp每一次goserve(l)都会构建Request数据结构。在大量数据请求或高并发的场景中,频繁创建销毁对象,会导致GC压力。解决办法之...

  09-01阅读数 311首先理解一点cache_allocer结构体里面的free_list只是一个指针,保存的是当前空闲的内存的地址,node结构体里面有一个node指针,node和node里面的指针是两个指针变量,fre...

  11-25阅读数 58万+jquery/js实现一个网页同时调用多个倒计时(最新的)nn最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦!nnnn//jsn...

  阿里Java架构师分享自己的成长经历, 教你如何快速成长为架构师阅读数70

本文链接:http://shawntierney.com/fangwenjubuxing/587.html