首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL如何从缓冲池中逐出页面?

MySQL从缓冲池中逐出页面的过程称为页面淘汰(page eviction)。当MySQL需要从缓冲池中释放空间以供新的数据页加载时,会根据一定的策略选择需要淘汰的页面。

MySQL使用了一种叫做最近最少使用(Least Recently Used,LRU)的算法来进行页面淘汰。LRU算法基于页面最近被访问的时间来判断页面的使用频率,较久未被访问的页面会被优先淘汰。

具体的页面淘汰过程如下:

  1. 当MySQL需要从磁盘加载一个新的数据页到缓冲池时,会检查缓冲池中是否有足够的空间。如果没有足够的空间,则需要进行页面淘汰。
  2. MySQL会根据LRU算法选择最久未被访问的页面进行淘汰。这个选择过程是基于页面的访问时间戳来进行的。
  3. 被选择的页面会被写回磁盘(如果被修改过),然后从缓冲池中移除,释放空间。
  4. 新的数据页会被加载到缓冲池中,供后续的查询操作使用。

页面淘汰的目的是保持缓冲池中的数据页是最有用的数据,以提高查询性能。通过LRU算法,MySQL能够较好地适应不同的查询访问模式,将频繁访问的数据页保留在缓冲池中,而淘汰不常用的数据页。

腾讯云提供了多种与MySQL相关的产品和服务,例如:

  • 云数据库 MySQL:提供稳定可靠的云端数据库服务,支持高可用、备份恢复、性能优化等功能。详情请参考:https://cloud.tencent.com/product/cdb_mysql
  • 云数据库 TencentDB for MySQL:提供高性能、可扩展的云数据库服务,支持自动备份、灾备、监控等功能。详情请参考:https://cloud.tencent.com/product/tencentdb_mysql
  • 云数据库 MariaDB:提供基于MariaDB的云数据库服务,兼容MySQL,支持高可用、备份恢复、性能优化等功能。详情请参考:https://cloud.tencent.com/product/mariadb
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【CMU15-445 FALL 2022】Project #1 - Buffer Pool

磁盘上叫page,缓存池中叫frame 使用ExtendebleHashTable将page_id映射到frame_id 使用LRUKReplacer类跟踪页面对象何时被访问,以便在必须释放一个帧以腾出空间磁盘复制新的物理页面时...frame_id 与page_id page_id是所对应的物理页id,frame_id是对应的内存中的缓冲池的页面id free_list: 缓冲池中空闲的frame,如果没有可驱逐的,无法创建新页面...,返回false,否则返回 true ---- void FlushAllPgsImp() override; 功能 将缓冲池中的所有页面刷新到磁盘。...---- auto DeletePgImp(page_id_t page_id) -> bool override; 功能 从缓冲池中删除页面。...如果page_id不在缓冲池中,则不执行任何操作并返回 true。如果页面已固定且无法删除(即被引用),请立即返回 false。

28330
  • 如何 MongoDB 迁移到 MySQL

    最近的一个多月时间其实都在做数据库的迁移工作,我目前在开发的项目其实在上古时代是使用 MySQL 作为主要数据库的,后来由于一些业务上的原因 MySQL 迁移到了 MongoDB,使用了几个月的时间后...关系到文档 虽然这篇文章的重点是 MongoDB 迁移到 MySQL,但是作者还是想简单提一下 MySQL 到 MongoDB 的迁移,如果我们仅仅是将 MySQL 中的全部数据导入到 MongoDB...文档到关系 相比于 MySQL 到 MongoDB 的迁移,反向的迁移就麻烦了不止一倍,这主要是因为 MongoDB 中的很多数据类型和集合之间的关系在 MySQL 中都并不存在,比如嵌入式的数据结构...主键与 UUID 我们希望 MongoDB 迁移到 MySQL 的另一个重要原因就是 MongoDB 每一个文档的主键实在是太过冗长,一个 32 字节的 _id 无法给我们提供特别多的信息,只能增加我们的阅读障碍...总结 如何 MongoDB 迁移到 MySQL 其实是一个工程问题,我们需要在整个过程中不断寻找可能出错的问题,将一个比较复杂的任务进行拆分,在真正做迁移之前尽可能地减少迁移对服务可用性以及稳定性带来的影响

    5.2K52

    InnoDB数据锁–第2.5部分“锁”(深入研究)

    现在,让我们证明锁系统并不真正知道列的值,因此我们必须查看缓冲池中实际页的内容以填充LOCK_DATA列。...可以将缓冲池视为磁盘上实际页面的缓存(抱歉,过于简化:实际上,它可能比磁盘页面上的数据更新,因为它还包含存储在重做日志增量中的页补丁)。...Performance_schema仅使用来自缓冲池的数据,而不使用来自磁盘的数据,如果它无法在其中找到页面,不会尝试磁盘获取数据,而是在LOCK_DATA列中报告NULL。...我们如何强制从缓冲池中逐出页?总的来说:我不知道。似乎可行的方法是将更多的新页推入缓冲池以达到其容量,并且逐出最早的页。为此,我将打开一个新客户端并创建一个表,使其太大而无法容纳在缓冲池中。有多大?...这仅表示该页面当前在缓冲池中不可用。

    1.3K10

    MySQL的逻辑架构--逻辑架构剖析、SQL执行流程、数据库缓冲池(buffer pool)

    pool) 缓冲池vs查询缓存 查询缓存 缓存池如何读取数据 查看/设置缓冲池的大小 多个Buffer Pool实例 逻辑架构剖析 Connectors Connectors指的是不同语言与SQL...MySQL服务器有专门的TCP连接池限制连接数,采用长连接模式复用TCP连接 TCP连接收到请求后,必须分配给一个线程专门与这个客户端的交互,所以还有个线程池,每一个连接线程池中获取线程,省去了创建和销毁线程的开销...比如表缓存,记录缓存,key缓存,权限缓存等 这个查询缓存可以在不同客户端共享 MySQL5.7.20开始,不推荐使用查询缓存,并在MySQL8中删除 第三层:引擎层 和其他数据库相比,MySQL...缓冲池服务于数据库整体的I/O操作,它们的共同点都是通过缓存的机制来提升效率 缓存池如何读取数据 缓冲池管理器会尽量将使用的数据保存起来,在数据库进行页面操作读操作的时候,首先会判断该页是否存在缓冲池中...,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面放到缓冲池中再进行读取。

    63930

    InnoDB 层锁、事务、统计信息字典表 | 全方位认识 information_schema

    当包含已锁定记录的页面不在缓冲池中时(在锁定期间已将其分页到磁盘的情况下),InnoDB为避免不必要的磁盘操作不会磁盘获取页面。...可以使用tcpdump生产环境的网络流量到一个测试实例中,并在测试实例中查询该表 * 当删除表、表中的数据行、分区表的某个分区、或表的索引时,相关联的页将仍然保留在缓冲池中,直到其他数据需要更多的缓冲池空间时才会从缓冲池中驱逐这些页...----------------------------------------+ 18 rows in set (0.01 sec) | INNODB_BUFFER_PAGE_LRU 该表提供查询缓冲池中页面信息...,与INNODB_BUFFER_PAGE表不同,INNODB_BUFFER_PAGE_LRU表保存有关innodb buffer pool中的页如何进入LRU链表以及在buffer pool不够用时确定需要从缓冲池中逐出哪些页...而处于young sublist链表中的“young”页达到一定时间就会从缓冲池中老化,成为old sublist链表中的“not young”页,“not young”页更接近驱逐点(当缓冲池中没有足够的空闲页时

    1.4K30

    MySQL系列】- 浅入Buffer Pool

    为了提高缓存管理的效率,缓冲池被实现为一个页面链表;使用最近最少使用(LRU)算法将最近最少使用的数据从缓存中淘汰。 了解如何利用缓冲池将频繁访问的数据保存在内存中是MySQL调优的一个重要方面。...这样当缓冲池需要加载一个数据页时就可以空闲链表上取一个数据页,然后再把给该数据页对应的链表节点上移除,表示该数据页已经被使用。...热链和冷链的数据会随着新数据的添加而变化,当新的数据页被添加进缓冲池中时,它会被插入到冷链的Head头部,当数据页被访问之后就会冷链移动到热链的头部。...(extent)的页面超过这个系统变量的值,就会触发一次异步读取下一个区中全部的页面缓冲池的请求。...随机预读 如果缓冲池中已经缓存了某个区的13个连续的数据页,不论这些数据页是不是顺序读取的,都会触发一次异步读取本区中所有其他的页面缓冲池的请求,随机预读是针对当前extent的。

    79820

    MySQL的worklog

    “当一个表空间被截断或删除时,InnoDB扫描LRU和FLUSH(脏页)列表,并将属于被截断/删除的表空间的所有页面LRU/FLUSH列表移动到缓冲池空闲列表中。...对于> 32G的缓冲池,这种完整的列表扫描会减慢用户线程的行进速度。由于InnoDB不知道一个表空间在缓冲池中有多少页,它将扫描整个列表,即使该表是空的或者缓冲池中只有一个页(或者没有)。...对于一个页面写,进行持久性化时,它必须有一个版本号>= DVER。带有VER < DVER的页将被释放。处理读取要复杂一些。当调用者试图从缓冲池中获取页面时,我们需要检测该页面是否过时。...如果页面过期,则释放该页面并强制读取磁盘。这种对所有读取的陈旧页面的检查成本应该非常低,否则它将花费我们从缓冲池中获取每个页面的成本。...此外,临时表空间在truncate上重用表空间ID(这是非常常见的),我们必须确保在旧实例的内存被释放之前,从缓冲池中延迟清除任何过时的页面。在处理过期页面时,我们必须处理对刷新的影响。

    1K30

    Innodb存储引擎之插入缓冲

    这个innodb_buffer_pool就是所谓的缓冲池,你可以在MySQL中使用下面的语句来查看buffer pool的相关信息: mysql--dba_admin@127.0.0.1:(none)...,在该模式下,几个insert语句,就会重复的进行几次页面的IO操作,因为每次insert 都会进行一次页面的IO操作,而且这种数据页之间没有任何关系,大量随机的在磁盘中寻找数据页,这样对MySQL的性能会产生极大的影响...,然后刷盘,而是先判断即将插入的普通索引页是否在缓冲池中,如果该普通索引页已经存在于缓冲池中,则直接进行插入操作;如果该普通索引页不存在于缓冲池中,则innodb会将这些insert操作先存放到缓冲池中...,然后再以一定的频率将缓冲池中的insert操作和数据页进行合并。...如下图: 步骤一:假设一个页面上保存5条记录,页号为1的数据页此时在缓冲池中,那么一次性插入编号1和编号2两条insert语句,页号为9的数据页不在缓冲池中,那么编号7和编号8的insert语句不着急插入

    68610

    MySQL逻辑架构(2)

    数据库缓冲池(buffer pool) InnoDB 存储引擎是以页为单位来管理存储空间的,我们进行的增删改查操作其实本质上都是在访问页 面(包括读页面、写页面、创建新页面等操作)。...在 InnoDB 存储引擎中有一部分数据会放到内存中,缓冲池则占了这部分内存的大部分,它用来存储各种 数据的缓存,如下图所示: 图中,你能看到 InnoDB 缓冲池包括了数据页、索引页、插入缓冲、锁信息...3.2 缓冲如何读取数据 缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行页面读操作的时候,首先会判断该页面 是否在缓冲池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓冲池中再进...我们看下如何查看缓冲池的个数,使用命令: show variables like 'innodb_buffer_pool_instances' 那每个 Buffer Pool 实例实际占多少内存空间呢...3.5 引申问题 Buffer Pool是MySQL内存结构中十分核心的一个组成,你可以先把它想象成一个黑盒子。

    47720

    DBA面试题:MySQL缓存池LRU算法做了哪些改进?

    下图是MySQLMySQL5.7版本)体系架构图 MySQL的InnoDb Buffer Pool 缓冲池是主内存中的一个区域,用来缓存InnoDB在访问表和索引时的数据。...对于频繁使用的数据可以直接内存中访问,从而加快处理速度。如果一台服务器专用作MySQL数据库使用时,通常将70%~80%(具体看总内存大小而定)的物理内存空间分配给缓冲池。...MySQL为了提高大批量数据读取操作的效率,将缓冲池划分为可以潜在地容纳多行的页面。为了提高缓存管理的效率,缓冲池被实现为页面的链接列表;最近很少被使用的数据会使用LRU算法的变体从缓存中淘汰出去。...随着数据库的运行,未被访问的缓冲池中页面通过向列表的尾部移动而“老化”。随着其他页面被设置为新页面,冷数据区中的页面都会老化。随着页面被插入midpoint,冷数据区中的页面也会老化。...LRU算法通过淘汰长时间未被访问的数据页,确保缓冲池中存储的是最可能被再次访问的数据,从而提高数据检索的效率。

    15810

    InnoDB 页面压缩Page Compression可降低磁盘开销,提高吞吐量。

    行格式压缩的COMPRESSED Row Format工作原理是:当用户获取数据时,如果压缩页不在Innodb_Buffer_Pool缓冲池里,那么就会磁盘加载进去,并且会在Innodb_Buffer_Pool...为了避免多次压缩和解压缩,当有足够的内存空间时,InnoDB 会尝试将压缩和解压缩的页面都保留在Innodb_Buffer_Pool缓冲池中。...当没有足够的内存空间时,InnoDB 会使用自适应 LRU 算法来决定是否应该Innodb_Buffer_Pool缓冲区中驱逐压缩或解压缩的页面。...使用页面压缩Page Compression时,表空间文件中读取压缩页面会立即解压缩,Innodb_Buffer_Pool缓冲池中只存储了解压缩页面。...相比之下,使用行格式压缩COMPRESSED Row Format时,解压缩页面和压缩页面都存储在Innodb_Buffer_Pool缓冲池中

    26910

    MySQL Innodb和Myisam

    当需要空间将新页添加到缓冲池时,最近最少使用的页会被逐出,并将新页添加到列表中间。...如果页是由于预读操作而读取的,则第一次访问不会立即发生,并且在页被逐出之前可能根本不会发生。 随着数据库的运行,缓冲池中未被访问的页会通过向列表尾部移动来“老化”。...缓冲池越大,就越InnoDB像内存数据库,磁盘读取数据一次,然后在后续读取期间内存访问数据。...可以将经常访问的数据保留在内存中,而不管操作的活动突然激增,这些操作会将大量不常访问的数据带入缓冲池。 可以控制如何以及何时执行预读请求以异步地将页预取到缓冲池中,以预期很快就会需要这些页。...可以配置如何InnoDB保留当前缓冲池状态以避免服务器重新启动后的长时间预热。 2、更改缓冲区 更改缓冲区是一种特殊的数据结构,当二级索引页不在缓冲池中时,它会缓存对二级索引页的 更改 。

    1.7K20

    Mysql-InnoDB 系列】InnoDB 架构

    为了方便缓存管理,缓冲池被实现成页的链表结构;很少使用的数据会使用LRU算法的一种变体从缓存中淘汰。 了解如何利用缓冲池将频繁访问的数据保存在内存中,是MySQL调优的一个重要方面。 ?...2.2 修改缓冲区 修改缓冲区是一个特殊的数据结构,用于缓存不在缓冲池中的那些二级索引页的变更。...双写缓冲区(doublewrite buffer)是一个存储区域,InnoDB在将页面写入InnoDB数据文件中的适当位置之前,会在其中写入从缓冲池中刷新的页面。...如果在页面写入过程中存在操作系统、存储子系统或意外的mysqld进程退出,InnoDB可以在崩溃恢复期间双写缓冲区中找到页的完好副本。...撤消日志记录包含有关如何撤消事务对聚集索引记录的最新更改的信息。如果另一个事务需要将原始数据视为一致读取操作的一部分,则会撤消日志记录中检索未修改的数据。

    1.2K10

    CMU 15445 2023fall Project1 Buffer Pool Manager

    当物理内存的页已满时,OS使用页面置换算法来选择哪些物理页将被逐出并加载新的虚拟页。页面置换算法的目标是尽量减少页面置换的次数,同时尽量减少对性能的影响。...当需要逐出页时,算法时钟的当前位置开始扫描物理页,如果访问位为0,则选择该页进行置换;如果访问位为1,则将访问位置为0,继续扫描。这样,算法会尽量保留最近被访问的物理页。...MySQL的Server层,是InnoDB存储引擎层的缓冲池。...当需要读取或写入数据时,存储引擎首先检查缓冲池中是否已经存在所需的数据页。如果数据页在缓冲池中,DBMS可以直接内存中读取或写入数据,避免了磁盘IO的开销。...如果数据页不在缓冲池中,DBMS就需要从磁盘加载数据页到缓冲池,并进行相应的操作。 相应的,缓冲池的管理也涉及到数据页的替换策略。当缓冲池已满时,需要替换一些数据页以腾出空间来存储新的数据页。

    1K10

    MySQL缓冲(change buffer),终于懂了!!!(收藏)

    上篇《MySQL缓冲池(buffer pool),终于懂了》,介绍了InnoDB缓冲池的工作原理。...(1)读取,会命中缓冲池的页; (2)缓冲池LRU数据淘汰,会将“脏页”刷回磁盘; (3)数据库异常奔溃,能够redo log中恢复数据; 什么时候缓冲池中的页,会刷到磁盘上呢?...此时麻烦一点,如上图需要1-3: (1)先把需要为40的索引页,磁盘加载到缓冲池,一次磁盘随机读操作; (2)修改缓冲池中的页,一次内存操作; (3)写入redo log,一次磁盘顺序写操作; 没有命中缓冲池的时候...此时的流程如序号1-3: (1)载入索引页,缓冲池未命中,这次磁盘IO不可避免; (2)缓冲读取相关信息; (3)恢复索引页,放到缓冲池LRU里; 画外音:可以看到,40这一页,在真正被读取时,才会被加载到缓冲池中...先说什么时候不适合,如上文分析,当: (1)数据库都是唯一索引; (2)或者,写入一个数据后,会立刻读取它; 这两类场景,在写操作进行时(进行后),本来就要进行进行页读取,本来相应页面就要入缓冲池,此时写缓存反倒成了负担

    1.4K81

    第04章_逻辑架构

    每一个连接线程池中获取线程,省去了创建和销毁线程的开销。 所以连接管理的职责是负责认证、管理连接、获取权限信息。... MySQL 5.7.20 开始,不推荐使用查询缓存,并在 MySQL 8.0 中删除 。...数据库缓冲池(buffer pool) InnoDB 存储引擎是以页为单位来管理存储空间的,我们进行的增删改查操作其实本质上都是在访问页面(包括读页面、写页面、创建新页面等操作)。...# 3.2 缓冲如何读取数据 缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行页面读操作的时候,首先会判断该页面 是否在缓冲池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓冲池中再进行读取...这里的脏页 (dirty page) 指的是缓冲池中被修改过的页,与磁盘上的数据页不一致。

    23220

    详解mysql数据库double write原理,性能影响及相关参数

    doublewrite缓冲区是位于系统表空间中的存储区域,在该区域中,InnoDB会在将页面写入数据文件中的适当位置之前,InnoDB缓冲池中刷新这些页面。...如果在页面写入过程中发生操作系统,存储子系统或mysqld进程崩溃,InnoDB稍后可以在崩溃恢复期间doublewrite缓冲区中找到该页面的良好副本。...很多DBA会想到系统恢复后,MySQL可以根据redolog进行恢复,而mysql在恢复的过程中是检查页面的校验和,checksum就是pgae的最后事务号,发生部分页面写问题,页面已经损坏,找不到该页面中的事务号...2)将数据双写缓冲区写入到真正的segment中的时候,系统会自动合并连接空间刷新的方式,每次可以刷新多个页面; 如果页面大小是16k,那么就有128个页面(1M)需要写,但是128个页面写入到共享表空间是...double在恢复的时候是如何工作的? 如果部分页面写入doublewrite缓冲区本身,则原始页面仍将保留在磁盘上的实际位置。

    3.9K30

    深入浅出 InnoDB Flushing

    定期扫描每个缓冲池实例的 LRU 列表中最旧的页面(因此得名),并将页面释放到变量值。如果这些页面之一是脏的,它将在被释放之前被刷新到磁盘。...InnoDB 只修改缓冲池中页面缓冲池中页面可能会被 SQL语句修改,变成脏页。在事务提交时,修改页面内容被写入重做日志--InnoDB 日志文件。写入后,增加 LSN(最后一个序列号)。...Pages to Flush for the avgLsnRate 根据 avgLsnRate 值,InnoDB 扫描缓冲池中最旧的脏页并计算小于尾部 avgLsnRate 的页数。...双写缓冲区存在争用。试试 Percona Server for MySQL 的并行双写缓冲区功能。 您是否有足够的page cleaners 来充分利用您的CPU和 IO ?...InnoDB 调优 行文至此,我们已经了解 InnoDB 是如何刷脏页到磁盘的,下一步就是如何针对刷脏进行调优。InnoDB 调优的相关参数将在 后面的文章中揭晓。

    85331

    面试官:能说一说Mysql缓存池吗?

    缓存池的基本原理 「读操作」: 在数据库中进行读取页的操作,首先把磁盘读到的页存放在缓存池中,下一次读取相同的页时,首先判断该页是不是在缓存池中。...可以看到缓存池中包括数据页、索引页、插入缓存、自适应哈希索引、锁信息、数据字段。 其中数据页和索引页会用掉多数内存。 「但是,innodb 是如何管理缓存池中的这么多页呢?」...加速读是当需要访问一个数据页面的时候,如果这个页面已经在缓存池中,那么就不再需要访问磁盘,直接从缓冲池中就能获取这个页面的内容。...因此需要考虑把已经缓存的页 Buffer pool 中删除一部分,进而需要考虑如何删除及删除哪些已经缓存的页。...,先将这个页面缓冲池中进行修改,记下相关的重做日志,这个页面的修改就算已经完成了。

    92820
    领券