我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL Buffer Pool怎么提高页的访问速度

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL Buffer Pool怎么提高页的访问速度

这篇文章主要介绍了MySQL Buffer Pool怎么提高页的访问速度的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL Buffer Pool怎么提高页的访问速度文章都会有所收获,下面我们一起来看看吧。

如何提高SQL执行速度?

当我们想更新某条数据的时候,难道是从磁盘中加载出来这条数据,更新后再持久化到磁盘中吗?

如果这样搞的话,那一条sql的执行过程可太慢了,因为对一个大磁盘文件的读写操作是要耗费几百万毫秒的

真实的执行过程是,当我们想更新或者读取某条数据的时候,会把对应的页加载到Buffer Pool缓冲池中(Buffer Pool本质上就是一块连续的内存空间)

默认为128m,当然为了提高系统的并发度,你可以把这个值设大一点

MySQL Buffer Pool怎么提高页的访问速度

之所以加载页到Buffer Pool中,是考虑到当你使用这个页的数据时,这个页的其他数据使用到的概率页很大,随机IO的耗时很长,所以多加载一点数据到Buffer Pool

Buffer Pool的数据结构是怎样的?

MySQL Buffer Pool怎么提高页的访问速度

Buffer Pool中主要分为2部分,缓存页和描述数据,MySQL从磁盘加载的数据页会放入缓存页中

对于每个缓存页都有对应的描述信息,比如数据页所属于表空间,数据页的编号等

Buffer Pool中的描述数据大概相当于缓存页大小的5%左右,这部分内存是不包含在Buffer Pool中的

当更新数据的时候,如果对应的页在Buffer Pool中,则直接更新Buffer Pool中的页即可,对应的页不在Buffer Pool中时,才会从磁盘加载对应的页到Buffer Pool,然后再更新,此时Buffer Pool中的页和磁盘中的页数据是不一致的,被称为脏页。这些脏页是要被刷回到磁盘中的

这些脏页是多会刷回到磁盘中的? 有如下几个时机

Buffer Pool不够用了,要给新加载的页腾位置了,所以会利用改进的后的LRU算法,将一些脏页刷回磁盘后台线程会在MySQL不繁忙的时候,将脏页刷到磁盘中redolog写满时(redolog的作用后面会提到)数据库关闭时会将所有脏页刷回到磁盘

这样搞,效率是不是高很多了?

当需要更新的数据所在的页已经在Buffer Pool中时,只需要操作内存即可,效率不是一般的高

我们怎么知道哪些缓存页是空闲的?

MySQL为Buffer Pool设计了一个free链表,它是一个双向链表,每个节点就是一个空闲缓存页的描述数据

MySQL Buffer Pool怎么提高页的访问速度

我们如何知道缓存页是否被加载到内存了?

很简单啊,建立一个哈希表不就行了,key为表空间号+页号,value为对应的缓存页

当把数据页读取到缓存页的时候,对应的描述数据会从free链表放到flush链表

MySQL Buffer Pool怎么提高页的访问速度

当不停的把磁盘上的数据页加载到缓存页,free链表不停的移除空闲缓存页,当free链表上没有空闲缓存页,当你还要加载数据页到缓存页时,该怎么办呢?

如果要淘汰一些数据,该淘汰谁呢?

引入LRU链表来判断哪些缓存页是不常用的?

缓存淘汰策略在很多中间件中会被用到,其中用的最多的就是LRU算法,当每访问一个缓存页的时候就把缓存页移到链表的头部

MySQL Buffer Pool怎么提高页的访问速度

我们只需要把链表尾部的缓存页刷到内存中,然后加载新的数据页即可。

这样的方式看似很完美,但是在实际运行过程中会存在巨大的隐患

首先就是mysql的预读,

哪些情况会触发MySQL的预读

当发生全表扫描的时候(比如 select * from users),会导致表里的数据页都加载到 Buffer Pool 中去。这样有可能导致LRU链表前面一大串数据页都是全表扫描加载进来的数据页,但是如果这次全表扫描过后后续几乎没用到这个表里面的数据呢?

这样就会导致经常被扫描的缓存页被淘汰了,留下的都是全表扫描加载进来的缓存页

为了解决这个问题,LRU链表改进了一下,采用了冷热分离的思想。

即LRU链表会被拆分为2部分,一部分是冷数据,一部分是热数据

MySQL Buffer Pool怎么提高页的访问速度

改进后的链表是如何工作的?

当数据页第一次被加载到缓存的时候,缓存页会被放到冷数据区域的链表头部。

那么冷数据区的缓存页多会放到热数据区呢?

你可能会想,当冷数据区的缓存页再次被访问时,就放到热数据区可以不?

mysql> SHOW VARIABLES LIKE 'innodb_old_blocks_pct';+-----------------------+-------+| Variable_name         | Value |+-----------------------+-------+| innodb_old_blocks_pct | 37    |+-----------------------+-------+1 row in set (0.02 sec)

当多线程访问Buffer Pool中的各种链表时,需要加锁保证线程安全,影响请求的处理速度,此时我们就可以将Buffer Pool分为多个,多线程访问事不会互相影响,提高了请求的处理速度

MySQL Buffer Pool怎么提高页的访问速度

在MySQL 5.7.5之前,Buffer Pool不能动态扩展,动态扩展。为了增加动态扩展就增加了chunk机制,有兴趣的小伙伴可以看看其他资料,就不多做分析了

MySQL Buffer Pool怎么提高页的访问速度

Buffer Pool的相关参数

学习了这么多理论知识,那么Buffer Pool应该调多大呢?

执行如下命令可以得到Buffer Pool的大小,名字,以及chunk的大小

SHOW VARIABLES LIKE '%innodb_buffer%'

MySQL Buffer Pool怎么提高页的访问速度

innodb_buffer_pool_size的单位是字节,我们转成MB来看一下,默认是128M

-- 128mSELECT @@innodb_buffer_pool_size / 1024 / 1024

执行如下命令可以得到buffer_pool的当前使用状态

SHOW STATUS LIKE '%buffer_pool%';

MySQL Buffer Pool怎么提高页的访问速度

我们挑一些重要的参数来分析一下

  • Innodb_buffer_pool_read_requests:读的请求次数

  • Innodb_buffer_pool_reads:从物理磁盘中读取数据的次数

  • Innodb_buffer_pool_pages_data:有数据的缓存页

  • Innodb_buffer_pool_pages_free:空闲缓存页

  • Innodb_buffer_pool_pages_total:总共的缓存页

Buffer Pool 读缓存命中率:

(Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / (Innodb_buffer_pool_read_requests) *100%

Buffer Pool 脏页比率:

Innodb_buffer_pool_pages_dirty / (Innodb_buffer_pool_pages_data)*100%

Buffer Pool 使用率:

innodb_buffer_pool_pages_data / ( innodb_buffer_pool_pages_data + innodb_buffer_pool_pages_free ) * 100%

缓存命中率比较低可以增大Buffer Pool的大小

使用率比较高时可以增大Buffer Pool的大小

你也可以执行如下命令获取一些关于Buffer Pool的其他参数

show engine innodb status;

关于“MySQL Buffer Pool怎么提高页的访问速度”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“MySQL Buffer Pool怎么提高页的访问速度”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL Buffer Pool怎么提高页的访问速度

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL Buffer Pool怎么提高页的访问速度

这篇文章主要介绍了MySQL Buffer Pool怎么提高页的访问速度的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL Buffer Pool怎么提高页的访问速度文章都会有所收获,下面我们一起来看看吧
2023-07-05

MySQL Buffer Pool如何提高页的访问速度

本文主要介绍了MySQL Buffer Pool如何提高页的访问速度,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-03

MySQL Buffer Pool如何提高页的访问速度

目录如何提高SQL执行速度?Buffer Pool的数据结构是怎样的?改进后的链表是如何工作的?Buffer Pool的相关参数参考博客如何提高SQL执行速度?当我们想更新某条数据的时候,难道是从磁盘中加载出来这条数据,更新后再持久化到磁
2023-03-06

怎么用提高网站访问速度

小编给大家分享一下怎么用提高网站访问速度,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最近公司开始考核企业站下所有站点,首先从itpub开始进行。为此,开始学习关
2023-06-08

视频云存储访问速度怎么提高

以下是提高视频云存储访问速度的几种方法:1. 使用CDN加速:通过使用CDN(内容分发网络),可以将视频内容缓存在多个节点上,从而加速访问速度。2. 压缩视频文件:将视频文件压缩成较小的文件,可以减少数据传输量,从而提高访问速度。3. 选择
2023-05-30

国外vps国内访问速度怎么提高

国外vps国内访问速度提高的方法:1、采用与国内直连的网络线路,能有效提高国内的访问速度;2、选择大带宽,能降低网络延迟,避免网络拥挤,提高国内的访问速度;3、采用BGP智能网络线路,能根据当前网络情况进行智能识别,优先选择一条速度比较快的
2023-02-08

美国vps试用怎么提高访问速度

要提高美国VPS试用的访问速度,可以采取以下措施:1、选择合适的VPS主机配置根据实际需求选择合适的VPS主机配置,包括CPU、内存、存储空间和带宽等,以满足网站的访问需求。2、优化网站内容优化网站内容,如压缩图片、减少HTTP请求、使用C
2023-03-12

怎么提高美国服务器访问速度

提高美国服务器访问速度的方法有很多,以下是一些常见的方法:使用CDN(内容分发网络):CDN可以帮助加速网站的加载速度,通过在全球各地部署服务器来缓存网站内容,使用户可以从离他们更近的服务器获取数据,从而减少延迟时间。优化网站代码和图片:确
怎么提高美国服务器访问速度
2024-04-09

网站空间租赁怎么提高访问速度

以下是提高网站空间租赁访问速度的几种方法:1. 选择好的主机服务商:选择好的主机服务商是提高网站访问速度的关键。建议选择有良好口碑和稳定性、高速性能的主机服务商。2. 使用 SSD 硬盘:使用 SSD 硬盘可以提高网站的响应速度和读写速度,
2023-06-08

成都主机租用怎么提高访问速度

以下是一些提高成都主机租用访问速度的方法:1. 使用CDN加速:CDN是一种通过在全球各地分布的服务器上缓存网站内容来加速访问速度的技术。使用CDN可以减少网络延迟,提高网站的响应速度。2. 优化网站代码:优化网站代码可以减少加载时间,提高
2023-06-14

国外空间租用怎么提高访问速度

以下是一些提高国外空间租用访问速度的方法:1. 使用CDN(内容分发网络):CDN可以将站点的内容分发到多个服务器上,减少访问时的延迟和网络拥塞。2. 选择靠近用户的服务器:如果你的目标用户主要在某个地区,可以选择靠近该地区的服务器,减少访
2023-06-05

海外空间租用怎么提高访问速度

要提高海外空间租用的网站访问速度,可以采取以下措施:1. 使用CDN加速:使用CDN(内容分发网络)服务,将网站静态资源(如图片、CSS、JS等)分布到全球各地的CDN节点,让用户从离自己最近的节点获取资源,从而提高访问速度。2. 优化网站
2023-05-21

编程热搜

目录