首先我们说一下大查询会不会把内存打爆?

比如说主机内存有5g,但是我们一个大查询的数据有10g,这样会不会把内存打爆呢?

答案:不会

为什么?

因为mysql读取数据是采取边读边发的策略

select * from t1

这条语句的流程是这样的

1.读取数据放入net_buffer中,net_buffer大小是由net_buffer_length控制

2.net_buffer放满了以后,调用网络栈发送数据到客户端

3.如果发送成功就清空net_buffer,继续读取数据放入net_buffer中

4.如果发送函数返回EAGAIN或者WSAEWOULDBLOCK就表示本地网络栈满了,这时候就进入等待,知道网络栈重新可写,再继续发送。

根据这个流程来看,读取数据的时候占用的内存最多也就是net_buffer的大小。

InnoDB内存(buffer pool)管理

我们都知道mysql查询数据是先看内存中有没有数据,如果没有就从磁盘中读出来,然后在读入内存

所以说bufferpool对查询有加速效果,加速效果依赖于一个指标也就是内存命中率,如果命中率能达到100%那是最好的

通过

show engine innodb status

可以查看命中率

innodb buffer pool的大小是由参数innodb_buffer_pool_size控制的,一般设置为可用物理内存的60%-80%

内存淘汰

既然内存是一块固定大小的,那么存放在内存里的数据就肯定有的会被淘汰

下面是一个lur算法的基本模型

innodb管理bufferpool的lru算法是基于链表实现的

state1:我们要查询p3的数据,由于p3是在内存中的,那么久直接把p3移动到链表头部,

也就是对应图中state2的状态

state3中由于我们查询的px数据不是在px中,那么就从磁盘中查询出px的数据放入链表头部,

但是由于内存满了,所以

就会把pm的数据从链表尾部淘汰掉,从现象上来看就是最久没有被访问都的数据会被淘汰

这种算法对于mysql来说有什么问题??

如果我们对一个冷数据表进行全表扫描,比如说日志表,这些不是正常用户访问的表,

那么在bufferpool中就会大量存在这些数据的表,那么就会导致用户正常访问存放的业务数据会被淘汰掉,

就会导致大量数据需要重新读磁盘放入内存,这样性能就会大大降低

mysql肯定不会允许这种情况发生的,所以它基于上面的lru算法做了改进

下图就是改进后的模型

innodb把整个内存的前八分之五记为young区域,后八分之三记为old区域,

我们看上图state1中由于我们访问的p3是在young区域,那么就把p3移动到链表头部

但是如果我们访问的数据如果是在old区域,比如说我们访问了px,这个时候会做个判断

如果px在内存中存活时间超过1秒,就会把它移动到young区域的链表头部,否则位置不动

这个1秒是由参数

innodb_old_blocks_time控制的,默认值是1000,单位毫秒

这样我们在看扫描全表的步骤

扫描过程中被访问的数据页会被放在old区域

一个数据页有多条记录会被访问,所以这数据页会被多次访问到,但是由于是顺序扫描,

这个数据页第一次被访问和最后一次被访问的时间间隔不会超过一秒,所以就会一直在old区域

在继续扫描后面的数据页,之前的这个数据页也不会被访问到,因此就会一直在old区域,也就很快就会被淘汰掉了

可以看到这个策略的最大收益,就是在扫描的过程中,虽然也用到了bufferpool,

但是不会对young区域造成影响,也就保证了bufferpool响应业务的内存命中率

会不会导致内存泄漏_mysql内存数据淘汰机制和大查询会不会把内存打爆?相关推荐

  1. mysql c接口内存泄漏_MySQL C ++连接器内存泄漏

    我确实一直在浏览类似的帖子,但是找不到适合我的问题的任何东西. 我正在尝试制作一个基本程序,用MySQL数据库进行查询,而且一切正常,但是我有很多内存泄漏. #include #include int ...

  2. 【内存泄漏】一个现网问题告诉你血淋淋的事实:java内存泄漏很严重

    目录 什么是内存泄漏 GC原理 GC Roots对象 java内存模型 现网问题 如何发现和解决 总结,什么情况下会出现内存泄漏 很多同学可能都有一个误解,C++才需要程序员自己管理对象的生命周期,在 ...

  3. mysql单表数据列_MySQL 之 数据操作及单表查询

    1.数据操作 (1)insert 增加数据 1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3-字段n) VALUES(值1,值2,值3-值n); 语法二: ...

  4. 一文带你了解如何排查内存泄漏导致的页面卡顿现象

    作者 | 零一0101       责编 | 欧阳姝黎 不知道在座的各位有没有被问到过这样一个问题:如果页面卡顿,你觉得可能是什么原因造成的?有什么办法锁定原因并解决吗? 这是一个非常宽泛而又有深度的 ...

  5. java 导致内存泄露的情况_JConsole定位内存泄漏

    在本文中,我们将看到Java中内存泄漏的示例代码.之后,我们将把Java应用程序连接到JConsole,比较有无内存泄漏时应用程序的内存使用情况.深入研究JConsole的内存监控工具可以让我们看到堆 ...

  6. 内存泄漏,关于异步回调导致的内存泄漏,使用LeakCanary检测内存泄漏

    在任何程序开发中,异步操作的处理都是一个麻烦事,而在 Android 中更繁杂一些,这是由于 Android 基于组件的设计对异步操作不够友好.所以,如果你在 Android 中开发界面,不妥善处理全 ...

  7. android释放acitity内存,Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  8. 内存泄漏和内存溢出的关系和区别

    作者:不怕天黑_0819 链接:https://www.jianshu.com/p/61d34df7eabe 一.内存泄漏(memory leak) 1.内存泄漏是指程序中已动态分配的堆内存由于某种原 ...

  9. 事务处理不当,线上接口又双叒内存泄漏了!(附图解问题全过程)

    来自:匠心Java 情景 项目上线了一个接口,先灰度一台机器观察调用情况:接口不断的调用,过了一段时间,发现机器上的接口调用开始报 OOM异常 ! 当天就是上线deadline了,刺激.. 发现问题 ...

  10. 排查 Node.js 服务内存泄漏,没想到竟是它?

    背景 团队最近将两个项目迁移至 degg 2.0 中,两个项目均出现比较严重的内存泄漏问题,此处以本人维护的埋点服务为例进行排查.服务上线后内存增长如下图,其中红框为 degg 2.0 线上运行的时间 ...

最新文章

  1. 谷歌 chrome 浏览器开发者工具打不开的解决方法
  2. java类注入service为null_解决webservice(Java)中dao层注入为null问题
  3. 分布式事务不理解?一次给你讲清楚!
  4. 10-7 B2-1查找订单数最多的员工信息 (20 分)
  5. java 读取集合到流中_Java 10:将流收集到不可修改的集合中
  6. PrimeFaces Mobile入门
  7. JMeter对数据库的更新操作
  8. 解决网页内容自制不了,文档复制需要VIP权益方法
  9. 计算机硬件系统基本组成
  10. Win10--YOLOX训练和测试VOC格式数据
  11. 百度地图移动端https 问题解决记录,也许是这个问题
  12. 浏览器被360劫持解决办法
  13. [YNOI2017]由乃的商场之旅 莫队
  14. Windows10windows server 2012r2作为slave 用jenkins部署微信小程序自动化打包
  15. 【手把手】ElasticSearch的脚本查询相关
  16. R语言机器学习之caret包详解(一)
  17. 软件测试-如何体现自己的价值?
  18. 密码学第三讲——对称密码(XOR与一次性密码本)
  19. 帝国cms 搭建 仿站
  20. R语言进行meta分析教程

热门文章

  1. 70个具有商业实战性的精品Android源码
  2. 如何在程序中安装指定apk文件
  3. Hyper-V应用指南之5-导出、导入虚拟机
  4. 当U盘内的文件夹都成了1KB的快捷方式的解决方法
  5. 加速nginx: 开启gzip
  6. Nginx监控数据采集与分析
  7. [译] 为什么需要在 React 类组件中为事件处理程序绑定 this
  8. linux下防火墙基础知识之iptables
  9. 猝不及防,iOS9.3测试版已经遭到越狱?
  10. 面试题:谈谈如何优化MYSQL数据库查询