InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式

https://mp.weixin.qq.com/s/HGa_90XvC22anabiBF8AbQ

在这篇文章里,我将讨论在MySQL 5.7里如何使用InnoDB缓冲池预加载特性。

从MySQL 5.6开始,可以配置MySQL保存InnoDB缓存池的数据,并在启动时加载。在MySQL 5.7后,这是默认行为。在默认配置中,MySQL保存和恢复缓存池的一部分,不再需要任何特殊的配置。我们在Percona Server 5.6中提供了一个类似的功能,所以这个概念已经存在了相当长的时间。

坦率来说,时间已经减少了这个特性的需求。五年前,我们通常是在旋转的硬盘上存储数据库,在数据库正常工作负载下,这些磁盘经常要相当长的时间来预热,这导致在重启之后,好几个小时都是低性能的。

随着固态硬盘的崛起,预热变得很快并且减少了缓冲池中数据的加载。通常,一个系统在10分钟或更少的时间,就能达到其充分预热性能的90%。保存缓冲池内容是一个默认启用的特性,所以它的使用,不需要任何精力。

本篇文章将讨论关于这个功能的一些问题,这些问题可能无法通过字面或文档看出来。

MySQL默认在InnoDB缓冲池(而不是整个缓冲池)中仅保留最频繁访问页的25%。

在多数使用场景下,合理的选择是:保留最有用的数据页,比加载所有的页(很多页可能在后续的工作中并没有访问到)在缓冲池中要更快。

你可以更改innodb_buffer_pool_dump_pct变量的值,如果使用InnoDB作为内存数据库时,想保证所有的数据都在内存驻留,并且可以在不读取磁盘的情况下访问,就要将它设为100。

请注意,这个变量是基于内存中的实际数据量,而不是缓冲池的大小。例如,如果有100GB的缓冲池,但只有10GB的数据,默认只有10GB的25%(即2.5GB)数据保存在内存中(如手册中所述,因为磁盘上只存储页面标识符,而不是完整页内容,所以磁盘上的访问量不会太大)。

MySQL启动并且在缓冲池加载完成前可以通过网络访问。同时在启动之前,大量资源用于尽快从磁盘读取到缓冲池,这个操作可能会影响性能。

如果你有多个MySQL节点(例如使用MySQL复制或Percona XtraDB 集群),则可以考虑在缓冲池加载操作完成后才将他们返回生产环境。您可以通过查看GLOBAL STATUS变量来监视缓冲池加载进度。

缓冲池加载进度:

 | Innodb_buffer_pool_load_status          | Loaded / pages         |

缓存池加载完成:

 | Innodb_buffer_pool_load_status          | Buffer pool(s) load completed at   ::

另一方面,如果MySQL能提供一个关于节点状态的清晰概念将更好:这与准备以最佳的方式服务于交换往往是不一样的。

InnoDB缓冲池预加载不是非常有效的,至少在快速存储上是这样的。在性能相当好的NVMe存储的测试环境中,在只读负荷下运行时,可以获得超过400MB的/秒的预热速率。InnoDB缓冲池预热速度达到100MB/S,我猜想问题是因为没有开许多并行IO请求的SSD存储运行时需要优化所导致的,但我没有做进一步的研究。

InnoDB缓冲池保存/恢复仅在正常关机状态下保留缓冲池内容。如果服务器崩溃,MySQL仍然会做缓冲池预加载,但仅仅是最近正常关机下的内容信息(存储在ib_buffer_pool文件中),这可能会将时间浪费在与当前工作负荷无关的数据加载上。定期运行操作,可以保证新页可以快速预热,即使是遇到MySQL崩溃的情况。

1 SET GLOBAL innodb_buffer_pool_dump_now=ON;

保留当前缓冲池的列表。

值得注意的是,MySQL崩溃的情况并不是经常碰到的。这个问题在备份时同样存在。MySQL slave从Percona XtraBackup或是LVM快照克隆库,这会导致这些操作性能降低。

希望本文的见解,能帮助你更好地利用这个功能。

InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式的更多相关文章

  1. spine实现预加载(一)

    前言 本文实现了spine动画的预加载,解决在战斗等大量加载spine动画的时候出现卡顿现象. 这里使用和修改三个类,直接修改的源码,当然你也可以继承LuaSkeletonAnimation,自己封装 ...

  2. 用javascript预加载图片、css、js的方法研究

    预加载的好处可以让网页更快的呈现给用户,缺点就是可能会增加无用的请求(但图片.css.js这些静态文件可以被缓存),如果用户访问的页面里面的css.js.图片被预加载了,用户打开页面的速度会快很多,提 ...

  3. Angular - 预加载 Angular 模块

    Angular - 预加载延迟模块 在使用路由延迟加载中,我们介绍了如何使用模块来拆分应用,在访问到这个模块的时候, Angular 加载这个模块.但这需要一点时间.在用户第一次点击的时候,会有一点延 ...

  4. android viewpage预加载和懒加载问题

    1.本人理解懒加载和预加载问题某种情况下可以归结为一类问题,下面我就说一下我遇到的预加载问题和懒加载问题及解决的相应方法: - [1 ] 预加载问题        描述:我用到了三个fragment. ...

  5. 巧力避免ViewPager的预加载数据,Tablayout+Fragment+viewPager

    问题描述 最近在进行一个项目的开发,其中使用到了Tablayout+Fragment+viewPager来搭建一个基本的框架,从而出现了设置数据适配器的时候,item的位置错乱问题.我打印log日志的 ...

  6. Gorm 预加载及输出处理(一)- 预加载应用

    单条关联查询 先创建两个关联模型: // 用户模型 type User struct { gorm.Model Username string `gorm:"type:varchar(20) ...

  7. HBuilder mui 手机app开发 Android手机app开发 ios手机app开发 打开新页面 预加载页面 关闭页面

    创建子页面 在mobile app开发过程中,经常遇到卡头卡尾的页面,此时若使用局部滚动,在android手机上会出现滚动不流畅的问题: mui的解决思路是:将需要滚动的区域通过单独的webview实 ...

  8. Maven,预加载资源文件

    预加载资源文件需要先启用功能: <build> <resources> <resource> <directory>src/main/resources ...

  9. Flying Pages:在单击之前预加载页面,打开网页快得飞起

    Flying Pages能够实现:在用户点击网页的链接之前,就预加载这个网页,当再点击这个网页时,页面便能飞速打开,能为网站优化加分.接下来,就由LOYSEO来讲解Flying Pages的使用方法. ...

随机推荐

  1. 自windows8以后,所有版本(专业版、企业版、旗舰版)都支持从 vhd 启动

    而在windows 7 中,只有:企业版.旗舰版: 支持 从 vhd 启动!

  2. [Laravel] 05 - Controller

    大纲 PHP章节貌似有类似功能,回头看下. 请求 URL 一.URL 处理方法 请求使用的是:symfony/http-foundation组件 $_GET, $_POST, $_COOKIE, $_ ...

  3. TP5分页类

    <?php class Page { public $page; //当前页 public $total; //总记录数 public $listRows; //每页显示记录数 private ...

  4. python使用requests发送multipart/form-data请求数据

    def client_post_mutipart_formdata_requests(request_url,requestdict): #功能说明:发送以多部分表单数据格式(它要求post的消息体分 ...

  5. [C] 在 C 语言编程中实现动态数组对象

    对于习惯使用高级语言编程的人来说,使用 C 语言编程最头痛的问题之一就是在使用数组需要事先确定数组长度. C 语言本身不提供动态数组这种数据结构,本文将演示如何在 C 语言编程中实现一种对象来作为动态 ...

  6. PHP跳出循环的方法及continue、break、exit的区别

    PHP中的循环结构大致有for循环,while循环,do{} while 循环以及foreach循环几种,不管哪种循环中,在PHP中跳出循环大致有这么几种方式: <?php $i = 1; wh ...

  7. SSM项目实战

    1.  实战才是检验学的怎么样的标准,一个小项目,运行老是出错,加上自己一贯的马虎的习惯,不严谨,就使学习之路更加的曲折了,感觉自己在这一行中比较吃力,但是自己选择了这条路,就得好好走下去,不要怀疑自 ...

  8. 用nodejs搭建一个简单的服务监听程序

    作为一个从业三年左右的,并且从事过半年左右PHP开发工作的前端,对于后台,尤其是对以js语言进行开发的nodejs,那是比较有兴趣的,虽然本身并没有接触过相关的工作,只是自己私下做的一下小实验,但是还 ...

  9. mysql命令大全用户管理相关命令

        1.登陆 mysql>mysql -uJDev -p 2.用户管理 mysql>use mysql; 3.查看有哪些登陆用户 mysql> select host,user, ...

  10. { MySQL基础数据类型}一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型

    MySQL基础数据类型 阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己 ...