欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

mysql缓冲区,mysql执行计划缓存

终极管理员 知识笔记 93阅读

2.2如何读取缓冲池中的数据缓冲池管理器会尝试保存经常使用的数据。在读取数据库中的页面时,它会先判断页面是否在缓冲池中。如果存在,它会直接读取。如果不存在,它会在读取之前通过内存或磁盘将页面存储在缓冲池中。数据库中缓存的结构和功能如下图所示。注意,在存储引擎中,查询缓存实际上,当我们修改数据库中的记录时,我们会首先修改缓冲池中页面的记录信息,然后数据库会以一定的频率刷新。

ode> 到磁盘上。注意并不是每次发生更新操作都会立刻进行磁盘回写。缓冲池会采用一种叫做 checkpoint 的机制 将数据回写到磁盘上这样做的好处就是提升了数据库的整体性能。

比如当 缓冲池不够用 时需要释放掉一些不常用的页此时就可以强行采用 checkpoint 的方式将不常用的脏页回写到磁盘上然后再从缓冲池中将这些页释放掉。这里脏页(dirty page) 指的是缓冲池中被修改过的页与磁盘上的数据页不一致

2.3 查看和设置缓冲池的大小

如果使用的是 MySQL MyISAM 存储引擎它只缓存索引不缓存数据对应的键缓存参数为 key_buffer_size你可以用它进行查看

如果使用的是 InnoDB 存储引擎可以通过查看 innodb_buffer_pool_size 变量来查看缓冲池的大小。命令如下:

show variables like innodb_buffer_pool_size;

即 innoDB 的默认的缓冲池大小只有 134217728/1024/1024128MB。我们可以修改缓冲池大小比如改为256MB方法如下

set global innodb_buffer_pool_size  268435456;

或者修改配置文件

[server]innodb_buffer_pool_size  268435456
2.4 多个Buffer Pool实例

Buffer Pool本质是InnoDB向操作系统申请的一块 连续的内存空间在多线程环境下访问Buffer Pool中的数据都需要 加锁 处理。在Buffer Pool特别大而且多线程并发访问特别高的情况下单一的Buffer Pool可能会影响请求的处理速度。所以在Buffer Pool特别大的时候我们可以把它们 拆分成若干个小的Buffer Pool每个Buffer Pool都称为一个 实例它们都是独立的独立的去申请内存空间独立的管理各种链表。所以在多线程并发访问时并不会相互影响从而提高并发处理能力。

可以在服务器启动的时候通过设置 innodb_buffer_pool_instances 的值来修改Buffer Pool实例的个数比方说这样下述值默认为1

[server]innodb_buffer_pool_instances2

查看缓冲池的个数使用命令

show variables like innodb_buffer_pool_instances;

每个 Buffer Pool实例占用内存空间为总共的大小除以实例的个数即如下公式

innodb_buffer_pool_size/innodb_buffer_pool_instances

即上面设置缓冲池总大小为256MB后再设置缓冲池实例数为2后计算结果为每个实例占用内存空间位128MB。

注意不是说Buffer Pool实例创建的越多越好分别管理各个Buffer Pool也是需要 性能开销 的InnoDB规定当innodb_buffer_pool_size的值小于1G的时候设置多个实例是无效的InnoDB会默认把innodb_buffer _pooL instances 的值修改为1。而我们鼓励在Buffer Pool大于或等于1G的时候设置多个Buffer Pool实例

2.5 引申问题

当我们查询数据的时候会先去Buffer Pool中查询。如果Buffer Pool中不存在存储引擎会先将数据从磁盘加载到Buffer Pool中然后将数据返回给客户端同理当我们更新某个数据的时候如果这个数据不存在于Buffer Pool同样会先将数据加载进来然后修改内存的数据。被修改过的数据会在之后统一刷入磁盘。

这个过程看似没啥问题实则是有问题的。假设我们修改Buffer Pool中的数据成功但是还没来得及将数据刷入磁盘MySQL就挂了怎么办? 按照上图的逻辑此时更新之后的数据只存在于Buffer Pool中如果此时MySQL宕机了这部分数据将会永久地丢失;
再者我更新到一半突然发生错误了想要回滚到更新之前的版本该怎么办?连数据持久化的保证、事务回滚都做不到还谈什么崩溃恢复?

Redo Log解决未及时刷盘MySQL宕机的问题

Undo Log解决发生错误事务需要回滚的问题

以上两个Log将在日志篇再详细分析。

标签:
声明:无特别说明,转载请标明本文来源!