InnoDB存储引擎--Innodb Buffer Pool(缓存池)

Innodb Buffer Pool的概念

InnoDB的Buffer Pool主要用于缓存用户表和索引数据的数据页面。它是一块连续的内存,通过一定的算法对这块缓存做有效的管理。官方文档建议,如果此台服务器为MySQL专用数据库服务器,一般可以指定为物理内存的80%给予InnoDB Buffer Pool缓冲区。(官方推荐)

为了提高大量读操作的效率,InnoDB Buffer Pool按照页的访问方式(Page=16KB)从数据文件中读取到buffer pool中,然后从内存条取相应大小的内存容量做映射,来保证多行的数据读取。

InnoDB Buffer Pool的缓存管理,是通过继承一个链表页(Linked list of pages)来实现的。对于不经常访问的数据会被刷出缓存区。运用的算法是LRU。

Innodb Buffer Pool的架构图

Innodb存储引擎 IO操作的架构图(补充)

Innodb Buffer Pool的内存划分

内存计算

mysql使用总内存 = global_buffers + thread_buffers

All thread buffer(会话/线程级内存分配总和) =

max_threads(当前活跃连接数) * (

read_buffer_size -- 顺序读缓冲,提高顺序读效率

+read_rnd_buffer_size -- 随机读缓冲,提高随机读效率

+sort_buffer_size -- 排序缓冲,提高排序效率

+join_buffer_size -- 表连接缓冲,提高表连接效率

+thread_stack -- 线程堆栈,暂时寄存SQL语句/存储过程

+thread_cache_size -- 线程缓存,降低多次反复打开线程开销

+binlog_cache_size -- 每个线程单独一个,用于缓存binlog日志



global buffer(SGA, 全局内存分配总和) =

innodb_buffer_pool_size -- InnoDB高速缓冲,行数据、索引缓冲,以及事务锁、自适应哈希等

+innodb_additional_mem_pool_size -- InnoDB数据字典额外内存,缓存所有表数据字典(在MySQL5.7.4之后,已经丢弃了)

+innodb_log_buffer_size -- InnoDB REDO日志缓冲,提高REDO日志写入效率

+key_buffer_size -- MyISAM表索引高速缓冲,提高MyISAM表索引读写效率

+query_cache_size -- 查询高速缓存,缓存查询结果,提高反复查询返回效率(在MySQL5.7.4之后,已经

+tmp_table_size

丢弃了)

实践操作

假设手头有一台8GB的服务器。

MySQL线程独享的内存就是=200×(2+2+2+2+4)= 2.3GB

其中max_threads=100

read_buffer_size=2m

read_rnd_buffer_size =2m

join_buffer_size=2m

sort_buffer_size=2m

thread_stack=128k

thread_cache_size=128k

binlog_cache_size =4m

MyISAM的key_buffer_size 给予1GB

innodb_log_buffer_size 给予32MB

系统的需要的内存给予1GB

那么,给予InnoDB buffer pool= 8-2.3-1-1 = 3.5GB左右。这个计算只是想说明内存的使用量不要一次给予太满。

适当留有空间。

我们在根据一些状态值Innodb_buffer_pool_bytes_dataInnodb_buffer_pool_pages_data,Innodb_buffer_pool_pages_total来计算buffer pool的使用状况。

mysql> show status like 'innodb_buffer_pool%';
+---------------------------------------+--------------------------------------------------+
| Variable_name | Value |
+---------------------------------------+--------------------------------------------------+
| Innodb_buffer_pool_dump_status | Dumping of buffer pool not started |
| Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 180615 11:52:38 |
| Innodb_buffer_pool_resize_status | |
| Innodb_buffer_pool_pages_data | 122786 |
| Innodb_buffer_pool_bytes_data | 2011725824 |
| Innodb_buffer_pool_pages_dirty | 2598 |
| Innodb_buffer_pool_bytes_dirty | 42565632 |
| Innodb_buffer_pool_pages_flushed | 1308659 |
| Innodb_buffer_pool_pages_free | 8131 |
| Innodb_buffer_pool_pages_misc | 155 |
| Innodb_buffer_pool_pages_total | 131072 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 0 |
| Innodb_buffer_pool_read_ahead_evicted | 0 |
| Innodb_buffer_pool_read_requests | 209287578 |
| Innodb_buffer_pool_reads | 2630 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 62241578 |
+---------------------------------------+--------------------------------------------------+
18 rows in set (0.00 sec)

Innodb_buffer_pool_bytes_data/Innodb_buffer_pool_pages_data=16384B=16KB 可以验证官方文档给予的一个page为16KB。

Innodb_buffer_pool_pages_total =(Innodb_buffer_pool_pages_misc +Innodb_buffer_pool_pages_free+Innodb_buffer_pool_bytes_data)

验证:131072=122786+8131+155,可以看到哪些页数free状态,哪些页是有数据的,哪些页是用于管理的。

Innodb_buffer_pool_bytes_data/ Innodb_buffer_pool_pages_total =122786/131072=93.67%,可以看出有96%的页面缓存在buffer pool page中。

InnoDB log buffer size的参数对应的一些状态变量如下:

mysql> show status like 'innodb_log%';
+---------------------------+----------+
| Variable_name | Value |
+---------------------------+----------+
| Innodb_log_waits | 0 |
| Innodb_log_write_requests | 60021944 |
| Innodb_log_writes | 58181467 |

InnoDB存储引擎--Innodb Buffer Pool(缓存池)的更多相关文章

  1. InnoDB 存储引擎的线程与内存池

    InnoDB 存储引擎的线程与内存池   InnoDB体系结构如下: 后台线程: 1.后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据: 2.另外,将以修改的数据文件刷 ...

  2. 1009MySQL数据库InnoDB存储引擎Log漫游

    00 – Undo Log Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC). - 事务的原子性(Atom ...

  3. MySQL之InnoDB存储引擎 - 读书笔记

    1. MySQL 的存储引擎 MySQL 数据库的一大特色是有插件式存储引擎概念.日常使用频率最高的两种存储引擎: InnoDB 存储引擎支持事务,其特点是行锁设计.支持外键.非锁定读(默认读取操作不 ...

  4. MySQL技术内幕读书笔记(二)——InnoDB存储引擎

    目录 InnoDB存储引擎 InnoDB存储架构 Checkpoint技术 Master Thread 工作方式 InnoDB关键特性(放一下,感觉看后面,再看总结吧) InnoDB存储引擎 Inno ...

  5. mysql之innodb存储引擎

    mysql之innodb存储引擎 innodb和myisam区别 1>.InnoDB支持事物,而MyISAM不支持事物 2>.InnoDB支持行级锁,而MyISAM支持表级锁 3>. ...

  6. [转帖]mysql常用存储引擎(InnoDB、MyISAM、MEMORY、MERGE、ARCHIVE)介绍与如何选择

    mysql常用存储引擎(InnoDB.MyISAM.MEMORY.MERGE.ARCHIVE)介绍与如何选择原创web洋仔 发布于2018-06-28 15:58:34 阅读数 1063 收藏展开 h ...

  7. InnoDB存储引擎

    [InnoDB和MyISAM区别][ http://jeck2046.blog.51cto.com/184478/90499] InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型, ...

  8. 浅谈MySQL存储引擎-InnoDB&MyISAM

    存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的.每一种存储引擎都有它的优势和劣势,本文只讨论最常见 ...

  9. 剑指架构师系列-InnoDB存储引擎、Spring事务与缓存

    事务与锁是不同的.事务具有ACID属性: 原子性:持久性:由redo log重做日志来保证事务的原子性和持久性,一致性:undo log用来保证事务的一致性隔离性:一个事务在操作过程中看到了其他事务的 ...

随机推荐

  1. lamp环境搭建(apache安装,mysql安装,php安装)

    1.卸载系统内置的LAMP环境 1)卸载httpd服务(内置Apache) ① 使用rpm指令查询安装的httpd服务 ② 卸载httpd服务 如果出现以上提示,代表系统默认不允许我们卸载软件,使用强 ...

  2. C#中读写INI文件

    C#中读写INI文件 c#的类没有直接提供对ini文件的操作支持,可以自己包装win api的WritePrivateProfileString和GetPrivateProfileString函数实现 ...

  3. python 实践项目

    项目一:让用户输入圆的半径,告诉用户圆的面积 思路: 1.首先需要让用户输入一个字符串,即圆的半径 2.判断用户输入的字符串是否为数字  isalpha 3.求圆的面积需要调用到math模块,所以要导 ...

  4. 走进JDK(六)------ArrayList

    对于广大java程序员来说,ArrayList的使用是非常广泛的,但是发现很多工作了好几年的程序员不知道底层是啥...这我觉得对于以后的发展是非常不利的,因为java中的每种数据结构的设计都是非常完善 ...

  5. 卷积在深度学习中的作用(转自http://timdettmers.com/2015/03/26/convolution-deep-learning/)

    卷积可能是现在深入学习中最重要的概念.卷积网络和卷积网络将深度学习推向了几乎所有机器学习任务的最前沿.但是,卷积如此强大呢?它是如何工作的?在这篇博客文章中,我将解释卷积并将其与其他概念联系起来,以帮 ...

  6. TensorFlow 神经网络教程

    TensorFlow 是一个用于机器学习应用程序的开源库.它是谷歌大脑的第二代系统,在取代了近源的 DistBelief 之后,被谷歌用于研究和生产应用.TensorFlow 提供了很多种语言接口,包 ...

  7. [Swift]扩展UIImage :获取图片指定像素的颜色值

    对[UIImage]进行扩展 import UIKit extension UIImage{ /** 根据坐标获取图片中的像素颜色值 */ subscript (x: Int, y: Int) -&g ...

  8. Swift5 语言指南(十四) 下标

    类,结构和枚举可以定义下标,下标是用于访问集合,列表或序列的成员元素的快捷方式.您可以使用下标按索引设置和检索值,而无需单独的设置和检索方法.例如,您可以访问在元素Array实例作为someArray ...

  9. MySQL:锁

    根据加锁的范围,MySQL的锁可以分为全局锁,表级锁和行锁. 1. 全局锁 一般用于全局逻辑备份操作: 1.1 FTWRL MySQL提供了一个加全局读锁的方法.命令是:Flush tables wi ...

  10. spring-boot(hello world)

    重拾程序,想不到从java开始,最近两周开搞web,从基本框架开始,仅做个人学习记录,遗漏之处望请海涵. 1.基本准备 开发环境win7: IDE  myeclipse Version: 2017 C ...