东莞手机网站建设公司,网站建设人员要与客户谈什么,常宁网页定制,平面设计师是做什么InnoDB的缓存池作用:
缓存表数据和索引数据,把磁盘上的数据加载到缓冲池中,避免每次都进行磁盘IO,起到加速访问的效果.
LRU算法(Least recently used):
把入缓存池的页放在LRU的头部,作为最近访问的元素 页在缓冲池中的数据,把它放在队列的前面(情景一)页不在缓冲池中的数据,…InnoDB的缓存池作用:
缓存表数据和索引数据,把磁盘上的数据加载到缓冲池中,避免每次都进行磁盘IO,起到加速访问的效果.
LRU算法(Least recently used):
把入缓存池的页放在LRU的头部,作为最近访问的元素 页在缓冲池中的数据,把它放在队列的前面(情景一)页不在缓冲池中的数据,把它放在队列的前面,同时淘汰队列后面的数据(情景二)
情景一 情景二 MySQL不用LRU算法原因:
预读失效 提前把页放入了缓冲池但最终MySQL并没有从页中读取数据称为预读失效。缓冲池污染 当某一个SQL语句要批量扫描大量数据时可能导致把缓冲池的所有页都替换出去导致大量热数据被换出MySQL性能急剧下降这种情况叫缓冲池污染。
解决预读失效的方式:
将LRU分为两部分: 新生代老生带新生代,老生代首尾相连新页加入缓冲池前,先加入到老生带头部 如果数据真正的被读取,才会加入到老生带中如果数据没有被读取,则会比新生代的热数据更早的淘汰出缓冲池
解决MySQL缓冲池污染:
缓冲池污染案例: 有一个数据量较大的用户表当执行select * from user where name like %shenjian%;虽然结果集可能只有少量数据但这类like不能命中索引必须全表扫描就需要访问大量的页1把页加到缓冲池插入老生代头部2从页里读出相关的row插入新生代头部3row里的name字段和字符串shenjian进行比较如果符合条件加入到结果集中4…直到扫描完所有页中的所有row…如此一来所有的数据页都会被加载到新生代的头部但只会访问一次真正的热数据被大量换出。有一个数据量较大的用户表当执行 select * from user where name like %shenjian%; 虽然结果集可能只有少量数据但这类like不能命中索引必须全表扫描就需要访问大量的页 1把页加到缓冲池插入老生代头部 2从页里读出相关的row插入新生代头部 3row里的name字段和字符串shenjian进行比较如果符合条件加入到结果集中 4…直到扫描完所有页中的所有row… 如此一来所有的数据页都会被加载到新生代的头部但只会访问一次真正的热数据被大量换出。
解决方案: MySQL InnoDB数据参数设置:
参数innodb_buffer_pool_size 介绍配置缓冲池的大小在内存允许的情况下DBA往往会建议调大这个参数越多数据和索引放到内存里数据库的性能会越好。
参数innodb_old_blocks_pct 介绍老生代占整个LRU链长度的比例默认是37即整个LRU中新生代与老生代长度比例是63:37。 画外音如果把这个参数设为100就退化为普通LRU了。
参数innodb_old_blocks_time 介绍老生代停留时间窗口单位是毫秒默认是1000即同时满足“被访问”与“在老生代停留时间超过1秒”两个条件才会被插入到新生代头部。
总结:
缓冲池(buffer pool)是一种常见的降低磁盘访问的机制缓冲池通常以页(page)为单位缓存数据缓冲池的常见管理算法是LRUmemcacheOSInnoDB都使用了这种算法InnoDB对普通LRU进行了优化 将缓冲池分为老生代和新生代入缓冲池的页优先进入老生代页被访问才进入新生代以解决预读失效的问题页被访问且在老生代停留时间超过配置阈值的才进入新生代以解决批量数据访问大量热数据淘汰的问题