mysql冷热数据LRU_MySQL性能优化学习笔记(三)

2023-11-22 18:10

本文主要是介绍mysql冷热数据LRU_MySQL性能优化学习笔记(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在之前的文章《从零开始带你成为MySQL实战优化高手学习笔记(二) 关于buffer pool的相关知识》中,已经简单的了解了的一些buffer pool的东西:free链表用来记录哪些缓存页是空的,flush链表记录哪些是被修改过的。

目录

1、缓存页满了怎么办?

但是,free链表总会有空的时候,也就是说缓存页都满了,再没有空余缓存用来加载磁盘上的数据页?

这时候我们想,怎么办?是不是要把一部分缓存页淘汰掉,也就是清空,然后再加载新的数据页到缓存页。

如何淘汰?

1.1、LRU淘汰算法

1.1.1、策略:

MySQL使用了LRU淘汰算法,LRU也就是least recently use,最近最少使用。

策略就是使用的缓存页就加到LRU链表的头部,只要修改或者查询过就会移到链表头部,最后淘汰LRU尾部的。

1.1.2、存在的问题:

1、MySQL有个预读机制:当从磁盘中加载一个数据页的时候,有可能会把相邻的数据页也一块加载到缓存页。

这会带来什么问题?

a171ae6d40cb048cb9b77fc27206c991.png

看上图,比如,空间大小就为4,原本ABC都是经常被访问的,现在要加入虚线那两个数据页,必须要淘汰一个,那肯定就淘汰C,就把常访问的淘汰了,留下了没有访问的相邻数据页。

那么在此就有必要了解一下MySQL的预读机制

①、通过参数innodb_read_ahead_threshold控制,默认是56。这个参数表示如果顺序访问了一个区里的多个数据页,这里的多个就是56,就会触发预读机制,把下一个区中所有的数据页都加载到缓存页里。

②、通过参数innodb_random_read_ahead控制,默认是off。这个参数表示如果缓存了一个区的13个连续数据页,就会触发预读机制,把这个区里的页全都加载到缓存页里。

2、全表扫描

如果是全表扫描,会把全表都加载到buffer pool中,有可能就把LRU链表中经常访问的都挤到后面去,就有可能被淘汰。

如何优化呐?

既然有经常访问的数据,又有不常访问的数据,是不是可以在LRU链表中分区啊,对这两块数据分别管理。

1.2、基于冷热数据分离的思想设计LRU链表

所有把LRU链表分为两部分,冷热比例由innodb_old_blocks_pct参数控制,默认是37,也就是说冷数据占比37%。

1.2.1、策略

第一次加载的数据页,直接放到冷数据区域的头部。

15f2299742262b2b878df544bac59710.png

那什么时候放到热数据区域那?

通过参数innodb_old_block_time控制,默认1000,毫秒。这个参数表示,必须数据页加载到缓存页1000毫秒之后再次访问才加到热数据区域。

1.2.2、性能优化

位于热数据区域的数据,如果被访问了,应不应该立即加载热数据区域的头部?

无论链表方不方便,频繁的移动肯定是不希望的。MySQL规定,只有在热数据的后3/4部分的数据被访问了才会移动到链表头部。

1.3、冷数据的刷盘机制

之前的讨论都是说缓存满了才淘汰尾部数据刷入磁盘,实际上并不是非得等满了。后台有一个线程,运行一个定时任务,每隔一段时间就刷入磁盘然后清空这几个缓存页,并加到free链表中。

别忘了,刷入磁盘的不仅仅是冷数据区域,还有flush链表,等MySQL不是很忙的时候就会执行,然后从flush链表和LRU链表中移除。

1.4、总结

实际上就是不断的加载数据页到缓存页,然后不停的查询和修改缓存数据,free链表不停的减少,flush链表不停的增加,LRU链表不停的增加和移动。

另一边,后台线程不停的把LRU中的冷数据以及flush中的数据刷入磁盘,清空一部分缓存页。flush链表和LRU链表在减少,free链表在增多。

1.5 问题

如果要加载数据到缓存页,但是没空间了,就需要把冷数据刷盘,然后再读如缓存页,这就是两次磁盘IO。如果一直遇到这种情况,性能肯定很差,这又该怎么办?

欢迎关注微信公众号,公众号的好处是可以持续保持联系。

0b5c1459544048f41f9b552c30a72992.png

本文同步分享在 博客“w_boyang”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

这篇关于mysql冷热数据LRU_MySQL性能优化学习笔记(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_36328790/article/details/113649032
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/411960

相关文章

mysql中的group by高级用法详解

《mysql中的groupby高级用法详解》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,本文给大家介绍mysql中的groupby... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

MySQL数据库实现批量表分区完整示例

《MySQL数据库实现批量表分区完整示例》通俗地讲表分区是将一大表,根据条件分割成若干个小表,:本文主要介绍MySQL数据库实现批量表分区的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录一、表分区条件二、常规表和分区表的区别三、表分区的创建四、将既有表转换分区表脚本五、批量转换表为分区

宝塔安装的MySQL无法连接的情况及解决方案

《宝塔安装的MySQL无法连接的情况及解决方案》宝塔面板是一款流行的服务器管理工具,其中集成的MySQL数据库有时会出现连接问题,本文详细介绍两种最常见的MySQL连接错误:“1130-Hostisn... 目录一、错误 1130:Host ‘xxx.xxx.xxx.xxx’ is not allowed

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失

sql语句字段截取方法

《sql语句字段截取方法》在MySQL中,使用SUBSTRING函数可以实现字段截取,下面给大家分享sql语句字段截取方法,感兴趣的朋友一起看看吧... 目录sql语句字段截取sql 截取表中指定字段sql语句字段截取1、在mysql中,使用SUBSTRING函数可以实现字段截取。例如,要截取一个字符串字

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

MySQL中的事务隔离级别详解

《MySQL中的事务隔离级别详解》在MySQL中,事务(Transaction)是一个执行单元,它要么完全执行,要么完全回滚,以保证数据的完整性和一致性,下面给大家介绍MySQL中的事务隔离级别详解,... 目录一、事务并发问题二、mysql 事务隔离级别1. READ UNCOMMITTED(读未提交)2