• mysq优化三之buffer pool


    sql语句执行流程

     

    不管是select还是update,都是要查询把页取出来放在内存中,mysql中有一个单独的区域用来存放页,这就是buffer pool

    innodb architecture

     mysql启动的时候,会在内存中开辟一个128M的空间,这个空间就是buffer pool

     当再取一个页放在buffer pool中的什么位置呢,buffer pool中的页的位置是不连续的,那怎么管理呢。

     当前buffer pool有多少个空白页,free链表就有多少个控制块。

    如果要更新数据的时候,buffer pool中的页被修改了,那么就成了脏页,脏页什么时候持久化到磁盘中呢,怎么知道哪些页是脏页呢,mysql中还有一个链表是对脏页进行管理的。

    当有一个新的页要存放到buffer pool中时,但buffer pool已经存满了,那怎么办。这就要在LRU链表中根据LRU算法进行优化。新加入的页放到这个链表的头部,这个链表的最后一个控制块就是要淘汰掉的页。 

    有一些问题。

    场景1:全表扫描的时候,buffer pool中的页可能会被全部替换掉。这就会导致热点数据的访问性能会降低。

    所以mysql中是这样解决的,lru链表分为了两个区域,一个占八分之5,一个占八分之3,前面的是热数据区域,后面的是冷数据区域,新来的页放到冷数据区域的头部,冷数据区域的最后一个控制页释放掉

    那什么时候将冷数据区域中的页移动到热数据区域中来呢?冷数据区域中控制块对应的页第二次被访问到的时间大于1s时,这个页就会插入到热数据区域的头部。

    而全表扫描时,第二次访问与第一次访问的间隔时间肯定是小于1s的,所以页是不会移动到热数据区域的。

    更新的页什么时候到磁盘中呢,这就会跟事务有关系。

     

  • 相关阅读:
    持久化 XSS:ServiceWorkers 利用
    preg_replace引发的phpmyadmin(4.3.0-4.6.2)命令执行漏洞
    seacms6.5 注入漏洞1
    渗透中常见的网络端口
    composer安装指定版本的ThinkPHP
    php-fpm以root权限运行
    ntp网络时间服务器地址
    查看*.dll文件是32位还是64位的方法
    从经典案例学习SSRF漏洞的产生原因和修复方法
    Apache将AllowOverride设置为All以后出现403 Forbidden的解决方法
  • 原文地址:https://www.cnblogs.com/ckh2014/p/15479665.html
Copyright © 2020-2023  润新知