从 MySQL 获取数据,是从磁盘读取的吗?(Buffer Pool)

在 MySQL 中,数据是否从磁盘读取取决于数据是否已经被加载到内存中。MySQL 使用 InnoDB 存储引擎 中的 Buffer Pool 来优化磁盘 I/O,减少从磁盘读取数据的次数,提高查询性能。

Buffer Pool 的工作原理

  1. 缓存机制

    • Buffer Pool 是 InnoDB 存储引擎中的一个内存区域,用于缓存数据页(Data Page)、索引页和其他缓存的页面。每当 MySQL 查询数据时,首先会检查 Buffer Pool 中是否有相应的数据。
    • 如果 Buffer Pool 中已经缓存了需要的数据页,MySQL 就可以直接从内存中读取数据,避免了磁盘 I/O 操作,这样可以大幅提高查询效率。
  2. 从磁盘读取

    • 如果数据不在 Buffer Pool 中,MySQL 会从磁盘读取数据。InnoDB 会从数据文件中将数据页读取到内存中,然后返回查询结果。
    • 当数据被读取到 Buffer Pool 后,下次查询相同的数据时,可以直接从内存中获取,而无需再次访问磁盘。
  3. 缓存策略

    • LRU(Least Recently Used)算法:Buffer Pool 会根据 LRU 算法管理缓存数据页。当 Buffer Pool 满时,最近最少使用的数据页会被淘汰,以便腾出空间存储新的数据。
    • 写入操作:对于写入操作(如 INSERTUPDATEDELETE),数据首先写入 Buffer Pool,MySQL 会定期将这些修改后的数据刷写到磁盘(通过后台线程进行)。
  4. 刷盘机制

    • 即使数据已经缓存到 Buffer Pool 中,最终数据还是需要写入磁盘以保证持久性。InnoDB 会周期性地将内存中的数据刷新到磁盘的数据文件中,这个过程叫做 刷盘(Flushing)

总结

  • 数据从磁盘读取:当数据不在 Buffer Pool 中时,MySQL 需要从磁盘读取数据。
  • 缓存在内存中:为了提高性能,MySQL 会将读取的数据缓存在 Buffer Pool 中,以便后续查询时直接从内存中获取,减少磁盘 I/O。
  • 写入操作:写入操作首先发生在内存中,然后定期通过刷盘操作写回磁盘。

通过使用 Buffer Pool,MySQL 能够显著减少磁盘 I/O,提高查询和写入操作的效率。

从 MySQL 获取数据,是从磁盘读取的吗?(buffer pool)的更多相关文章

  1. php 写入数据到MySQL以及从MySQL获取数据,页面出现乱码的解决方法

    现象如标题. 解决思路: 1确定数据库charset是否是utf-8 a. charset不是utf-8 1, 更改数据库charset为utf-8 ALTER DATABASE db_name DE ...

  2. mysql启动报错cannot allocate memory for the buffer pool处理

    今天启动mysql服务器时失败了.去/var/log/mysql/查看error.log,报错信息如下: 160123 22:29:26 InnoDB: Initializing buffer poo ...

  3. PHP从mysql获取数据的方法

    <?php require "database.php"; //读取数据库中的数据 $sql_1 = "SELECT * FROM test_table" ...

  4. 从MySQL获取数据

    安装 PM> install-package newtonsoft.json PM> install-package mysql.data string connectionString ...

  5. 源码浅析:InnoDB聚集索引如何定位到数据的物理位置,并从磁盘读取

    索引结构概述: MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址.这与Oracle的索引结构相似,比较好理解.那么,常用的Innodb聚集索引结构是怎样的呢? InnoDB的数据文 ...

  6. Mysql删除数据后磁盘空间未释放的解决办法【转】

    转自 Mysql删除数据后,磁盘空间未释放的解决办法 - 今日头条(TouTiao.com)http://toutiao.com/a6303087712678412546/?tt_from=mobil ...

  7. Python3 多线程(连接池)操作MySQL插入数据

    1.主要模块DBUtils : 允许在多线程应用和数据库之间连接的模块套件Threading : 提供多线程功能 2.创建连接池PooledDB 基本参数: mincached : 最少的空闲连接数, ...

  8. JDBC 连接mysql获取中文时的乱码问题

    前段时间学习JDBC,要连接mysql获取数据.按照老师的样例数据,要存一些名字之类的信息,用的都是英文名,我当时就不太想用英文,就把我室友的名字存了进去,嘿嘿,结果,出问题了. 连接数据库语句: s ...

  9. [转]MySQL innodb buffer pool

    最近在对公司的 MySQL 服务器做性能优化, 一直对 innodb 的内存使用方式不是很清楚, 乘这机会做点总结. 在配置 MySQL 的时候, 一般都会需要设置 innodb_buffer_poo ...

  10. MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数 ...

随机推荐

  1. Oracle 遍历游标的四种方式汇总(for、fetch、while、BULK COLLECT)

    本文原创:https://www.cnblogs.com/Marydon20170307/p/12869692.html 感谢博主分享 注意:原文中方式四FORALL处有语法错误,应该使用FOR. 1 ...

  2. day05-面向对象编程:基础语法

    Java面向对象:类的基础语法 [ 任务列表 ] 1.面向对象快速入门 2.什么是面向对象 3.类的基础语法--构造器 4.类的基础语法--this关键字 5.类的基础语法--封装 6.类的基础语法- ...

  3. Codeforces 11D A Simple Task 题解 [ 蓝 ] [ 状压 dp ]

    思路不难想,细节比较多. 思路 观察到 \(n \le 19\) ,首先想到状压 dp . 于是自然地定义 \(dp[j][i]\) 为:抵达点的状态为 \(i\) ,且此时在点 \(j\) 时,简单 ...

  4. Markdown语法基础教学

    Markdown语法基础教学 简介 Markdown是一种轻量级的标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML.它的目标是实现"易读易写",并且 ...

  5. 分享一个 Windows 下的透明锁屏工具【开源】

    透明锁屏 担心展示内容时被误操作打断? 害怕离开后忘记锁屏导致隐私泄露? 厌倦了千篇一律的系统锁屏界面? 透明锁屏 了解一下. 功能特点 告别误操作:锁屏状态下,屏幕内容依然可见,视频播放.PPT 演 ...

  6. 【软件开发】Doxygen使用笔记

    [软件开发]Doxygen 使用笔记 Doxygen 是通过代码注释生成文档的事实标准,借用该工具可以将文档内容与代码写在一起方便维护. https://github.com/doxygen/doxy ...

  7. redis - [07] 数据类型

      redis是一个开源(BSD许可)的,内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件MQ.它支持多种类型的数据结构,如字符串(String).散列(Hash).列表(List).集合( ...

  8. Linux - 禁ping & 开放访问端口

    适用于Linux操作系统 禁ping 1.编辑 /etc/sysctl.conf 文件,文件末尾增加如下内容后,保存退出. net.ipv4.icmp_echo_ignore_all = 1 2.在命 ...

  9. Jsmoke-一款强大的js检测工具,浏览器部署即用,使用方便且高效

    Jsmoke by Yn8rt ​ 该插件由 Yn8rt师傅 开发,插件可以理解为主动版的hae和apifinder,因为其中的大多数规则我都引用了,当你认为当前页面,以及其调用的js文件存在敏感信息 ...

  10. 算子var_threshold

    算子var_threshold 名称 var_threshold - 通过局部均值和标准差分析对图像进行阈值处理. 签名 var_threshold(Image : Region : MaskWidt ...