mysql内存淘汰_mysql内存数据淘汰机制和大查询会不会把内存打爆?
首先我们说一下大查询会不会把内存打爆?
比如说主机内存有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内存淘汰_mysql内存数据淘汰机制和大查询会不会把内存打爆?相关推荐
- mysql第四篇:数据操作之多表查询
mysql第四篇:数据操作之多表查询 一.多表联合查询 #创建部门 CREATE TABLE IF NOT EXISTS dept (did int not null auto_increment P ...
- mysql query结果集_如何解决PHP使用mysql_query查询超大结果集超内存问题
再使用mysql_query查询超大结果集的时候会出现超出内存限制的致命错误,这是因为mysql_query采用的是查询全部结果然后把结果集全部缓存到内存中的方式. mysql的查询还提供了另外一种查 ...
- mysql删除员工_MySQL误删数据救命指南:开发人员必收藏
首先看下mysql误删数据排名最前的几种是: 1.误删文件 2.误删库.表 3.错误全表删除 / 更新 4.升级操作失误 都来看看你***过几个,hoho. 简单说下我亲手造的一个大事故吧. 那大概是 ...
- mysql库函数说明_MySQL 数据库函数库
mysql_affected_rows: 得到 MySQL 最后操作影响的列数目. mysql_close: 关闭 MySQL 服务器连接. mysql_connect: 打开 MySQL 服务器连接 ...
- java mysql 清空表_MySQL 删除数据表
MySQL 删除数据表 MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失. 语法 以下为删除MySQL数据表的通用语法: DROP TA ...
- linux mysql load_file语句_mysql导入数据load data infile用法
我的文章一般浅显易懂,不会搞那么深入让大家很难理解.(其实我水平也不咋样) LOAD DATA INFILE 一直被认为是MySQL很强大的一个数据导入工具,因为他速度非常的快. 不过有几个问题一定要 ...
- mysql 快速导出_Mysql 大量数据快速导出
mysqldump -u root -p -q -e -t webgps4 dn_location2 > dn_location2.sql mysqldump -u root -p -q -e ...
- mysql 新增更新_MySQL新增数据,存在就更新,不存在就添加(转帖加实测)
参考链接:https://blog.csdn.net/tiantang_1986/article/details/78037804 https://blog.csdn.net/woshihaiyong ...
- mysql查看用户名_Mysql创建数据表的方法介绍(附示例)
本篇文章给大家带来的内容是关于Mysql创建数据表的方法介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 数据表是数据库最重要的组成部分之一,是其他对象的基础.如果我们的 ...
- mysql -e 导出_mysql 导出数据导入数据
导出数据 mysqldump常用命令 1.只导出表结构,不导出数据 mysqldump -uroot -p123456 -d database > database.sql 2.只导出表数据,不 ...
最新文章
- java 教室借用管理系统_教师办事指南 | 借用教室
- 让tableView的高度等于contentSize的高度、动态调整tableView的高度、tableView的高度自适应布局...
- 以短带长进军网综,西瓜视频能否干过“优爱腾”?
- Python常用模块之序列化模块
- Linux学习笔记--文件夹结构
- 详解优先级队列priority_queue(应用+模拟实现)
- 20169210《Linux内核原理与分析》第十二周作业
- 前端学习(975):bootstrap轮播图
- 【C语言重点难点】数据类型、常量和变量
- #开工新姿势#开启一年新征程,云社区叫你来充电啦!
- parallels desktop 缺少组件_厦门100W5折电脑太阳能光伏组件,100W293mm*418mm*70mmMP4车载太阳能板...
- asp去HTML标签
- Tomcat启动时日志报 dcom.sun.manager.jmxremote 异常导致无法正常启动使用
- B2B、B2C、BOS系统都指哪些?
- 关于iOS 阴历阳历转化的那些事儿
- NTFS的忠实秘书—USN日志
- 所以Web 3.0到底是什么?
- 关于经典面试一年多少秒的思考!启发#define与UL!
- 2010大四面试经验(历程总结,笔试,群面,一面,二面,霸笔,霸面技巧和心得)
- 你还在为博客访问量少而发愁么?