最近在对公司的 MySQL 服务器做性能优化, 一直对 innodb 的内存使用方式不是很清楚, 乘这机会做点总结.

在配置 MySQL 的时候, 一般都会需要设置 innodb_buffer_pool_size, 在将 MySQL 设置在单独的服务器上时, 一般会设置为物理内存的80%.

之前一直疑惑 MySQL 是怎么缓存数据的(不是指query cache), 直觉应该是LRU, 但如果 query 一下从磁盘上读取大量的数据的话(全表扫描或是 mysqldump), 是不是很容易就会把热数据给踢出去?

Buffer Pool 的 LRU 机制

innodb buffer pool 在内存中其实是一个 list, 维护数据的确是用 LRU, 但是做了点优化.

buffer pool 将数据切割成两块, 头部是 young page list, 尾部是 old page list. 两者的空间比例默认是5: 3, 可以通过 show variables like “innodb_old_blocks_pct” 查看, old block的比例即为 37%.

当数据第一次被从磁盘上读取, 要加入 buffer pool 时, 会先放在 old page list 的头部, 此时如果 old page list 满了,则会把它尾部的数据踢出去. 当数据在buffer pool中被再次访问的时候, 如果它在 old page list 中, 则会被转移到 young page list 的头部(如果数据已经在 young page list 中, 则只有它和头结点的距离超过一定长度时才会被转移到头部).

通过这种机制, 可以有效得避免临时的大量数据读取冲刷掉 hot page, 这些一次性的数据如果没有被访问的话,很快会被从old page list 中踢出去.

查看 buffer pool 的使用状况

使用 show engine innodb status, 可以获取 innodb 的运行信息, 查看其中 BUFFER POOL AND MEMORY 一节, 可以看到 innodb buffer的使用情况.

示例:

BUFFER POOL AND MEMORY
----------------------
Total memory allocated 11948523520; in additional pool allocated 0
Dictionary memory allocated 881470
Buffer pool size 712576
Free buffers 7638
Database pages 676994
Old database pages 250018
Modified db pages 22961
Pending reads 4
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 86737875, not young 2068799422
188.89 youngs/s, 5482.68 non-youngs/s
Pages read 390735994, created 1284180, written 17312013
972.19 reads/s, 0.30 creates/s, 36.63 writes/s
Buffer pool hit rate 975 / 1000, young-making rate 4 / 1000 not 141 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 676994, unzip_LRU len: 0
I/O sum[374688]:cur[1688], unzip sum[0]:cur[0]

几个需要注意的参数:

Total memory allocated: innodb 已分配的总内存数, 单位 bytes

Buffer pool size: buffer pool 大小, 单位是 pages, MySQL 的 page 默认是 16KB, 这里 pool 的总大小就是 10G 多.

Free buffers: 还没使用的 buffer size, 单位也是 pages.

Database pages: 总共已使用的 page 数目.

Old database pages: old page list 中的 page 数目.

youngs/s: 每秒对 old page list 的访问次数(不是page的个数), 这种访问会就会把page从 old list 里移动到 new page list 的头部.

evicted without access: 放进 buffer pool 一次都没访问过就被踢出去的 page 数目. 如果发生了全表扫描, 这个数值可能就会临时变高.

补充

因为多线程对 buffer pool 进行访问的时候会发生资源竞争, MySQL 支持对 buffer pool 进行 sharding, 从而提高并发性能, 参数是innodb_buffer_pool_instances.

每个 instance 的 size = innodb_buffer_pool_size/innodb_buffer_pool_instances

官方推荐 sharding 后单个 instance 的 size 不要小于 1G*B. 比如我现在 pool 的总 size 是10 GB, 我设置的 instance 个数就是8.

上面 engine status 只能看到 buffer pool 的汇总情况, 如果想看每个 instance 的详情,
可以从 performance_schema 里拿:

SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_POOL_STATS

References:

https://dev.mysql.com/doc/refman/5.6/en/innodb-buffer-pool.html
https://dev.mysql.com/doc/refman/5.6/en/innodb-performance-midpoint_insertion.html
https://dev.mysql.com/doc/refman/5.6/en/innodb-buffer-pool-monitoring.html
https://dev.mysql.com/doc/refman/5.6/en/innodb-multiple-buffer-pools.html

转载于:https://www.cnblogs.com/sunss/p/6122075.html

[转]MySQL innodb buffer pool相关推荐

  1. 重学MySQL(InnoDB Buffer Pool是什么?)

    文章目录 InnoDB Buffer Pool是什么? 我们的数据是如何放在InnoDB Buffer Pool中的? InnoDB怎么知道数据页是否在Buffer Pool中? InnoDB Buf ...

  2. MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数 ...

  3. MySQL 引擎特性 · InnoDB Buffer Pool

    前言 用户对数据库的最基本要求就是能高效的读取和存储数据,但是读写数据都涉及到与低速的设备交互,为了弥补两者之间的速度差异,所有数据库都有缓存池,用来管理相应的数据页,提高数据库的效率,当然也因为引入 ...

  4. Innodb Buffer Pool的三种Page和链表

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 王航威 来源 | 公众号「yangyidba」 ...

  5. 14.6.3.1 The InnoDB Buffer Pool

    14.6.3.1 The InnoDB Buffer PoolInnoDB 保持一个存储区域被称为buffer pool 用于cache数据和索引在内存里,知道InnoDB buffer pool 如 ...

  6. 14.4.3.5 Configuring InnoDB Buffer Pool Flushing 配置InnoDB Buffer Pool 刷新:

    14.4.3.5 Configuring InnoDB Buffer Pool Flushing 配置InnoDB Buffer Pool 刷新:InnoDB执行某些任务在后台, 包括flush 脏数 ...

  7. 一文了解MySQL的Buffer Pool

    本文分享自华为云社区<MySQL 的 Buffer Pool,终于被我搞懂了>,作者:小林coding . 今天就聊 MySQL 的 Buffer Pool,发车! 为什么要有 Buffe ...

  8. MySQL 的 Buffer Pool,终于被我搞懂了

    大家好,我是小林. 今天就聊 MySQL 的 Buffer Pool,发车! 为什么要有 Buffer Pool? 虽然说 MySQL 的数据是存储在磁盘里的,但是也不能每次都从磁盘里面读取数据,这样 ...

  9. Mysql InnoDB存储引擎【二】InnoDB Buffer Pool 缓存池

    一.Innodb 架构图 1.整体架构图-内存结构 & 磁盘结构 二.Buffer Pool 缓存池 1. 缓存池实现 采用页面链表表(划分可能容纳多行的页) + 中点插入策略(新增加的页插入 ...

最新文章

  1. 树莓派 linux0.12,12 个可替代树莓派的单板机
  2. Linux系统弱口令检测和网络端口扫描方法(JR、NMAP)
  3. 前端学习(3046):vue+element今日头条管理-页面布局和面包屑筛选
  4. 打印英文年历C语言函数,C语言打印年历
  5. app开发第二次总结
  6. SSH框架与配置文件的简单搭建
  7. 连载四:PyCon2018|恶意域名检测实例(附源码)
  8. JAVA 基础 /第六课: 面向对象 / JAVA中的类和对象
  9. 数据仓库专题(16)-分布式数据仓库实践指南-目录篇
  10. 计算机电源在线工作,计算机开关电源的工作原理与维修2.pdf
  11. SDN:势不可挡的网络演进大潮
  12. MT4缠论公式指标(缠中狩猎外汇MT4缠论分笔分段中枢公式指标)
  13. pycharm的python解释器选择_pycharm中配置python解释器
  14. ucgui 嵌入式linux,uCGUI如何移植到S3C44B0X
  15. 计算机毕业设计jspm平面设计类众包威客网网站mjmBBmysql程序
  16. 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
  17. 日系插画学习笔记(十):色彩基础
  18. 哈夫曼树的构造与哈夫曼编码
  19. 使用 Visual Studio 2005中的ASP.NET 移动控件创建电子书浏览器应用程序
  20. Sci-Hub创始人收到苹果的通知:2年前就把她的账户数据给了FBI

热门文章

  1. 【ML】【GM】【转】图模型(graphical model, GM)的表示
  2. Android开发优化之——对界面UI的优化(经验分享)
  3. SQL Server 2005实现负载均衡的详细介绍
  4. DELL服务器结合nagios硬件监控、报警
  5. ASP.NET -- 缓存技术(1)
  6. 国产搜索引擎首超Google 中文搜索瓦解霸权?
  7. 干货|浅谈强化学习的方法及学习路线
  8. 查看网站上保存的密码
  9. 关于版本控制工具GitHub安装报错
  10. Objective-C 入门(七)协议 protocol(JAVA中的接口)