问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mysql数据库out of memory 内存溢出

发布网友 发布时间:2022-05-01 07:23

我来回答

3个回答

懂视网 时间:2022-05-02 23:57

比如说主机内存有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内存数据淘汰机制和大查询会不会把内存打爆?

标签:实现   sql查询   mamicode   src   engine   net   数据   本地   length   

热心网友 时间:2022-05-02 21:05

当数据库数据量过大,查询时没有条件语句,就会导致内存溢出,解决办法是加查询条件或者使用分页查询。

热心网友 时间:2022-05-02 22:23

1.修改配置文件,扩大查询内存方面的,例如tmp_table_size,还有别的根据实际情况放大点
2.优化查询语句,尽量避免查询整张表的数据
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
请问信用卡暂未批准是什么意思 短发搭配什么帽子能吸睛?get下文各种短发的搭配攻略 入门智能机vivoy200t怎么样? 直短发配什么帽子好看 老狗狗为什么总低头 脚跟骨裂做了手术还装了钢板,请问要多长时间才能恢复。 脚跟粉碎性骨折术后多久能走路 脚跟骨折多久可以正常走路 如图,AD是∠BAC的平分线,点E在AB上,且AE=AC,EF ∥ BC交AC于点F.试说明... 如图,AD是角BAC的平分线,点E在AB上,且AE=AC,EF//BC交AC于点F.求证:EC... 长帝烤箱 烤 管子不红 在不在烤 财务关账还能付钱吗 我的手腕是不是很细,手臂很粗? 农村房屋赠予问题 为什么我的身材不均匀,大腿和大臂都很粗,脚踝和手腕都很细 我手臂粗,但手腕好细,请问怎么锻炼能好看些? 我的手腕很细、可是大臂很粗… 怎么才能关掉耳机模式? 我的手腕很细但是手臂很粗 这是怎么个情况?? 手腕很细,手臂很粗是什么原因呢?请知情人士帮忙解答,谢谢! mysql 看是否被query cache 脚抽筋咋办? 中年妇女经常手抽筋要吃什么 中年人几天做一次面膜好? 你认为当前社会多少岁算是中年人? 2011年新款泳衣 监控网络键盘怎么修 笔记本的无线网键盘开关打不开,怎么办 选什么样文件柜的比较好用? 在三亚免税城买了卡地亚手表。刷卡76200 *上就50000多 下面还有负一万多这是什么鬼_百度问一问 麦酷拉maikula m1 怎么样 汰换合同记录在哪里看 平衡车下面的防转大圈 java+memcacged+mysql运行一会儿就报内存溢出错误 java.lang.OutOfMe... 麦酷拉m1可以连接蓝牙吗 麦酷拉maikula m1平衡车两轮和小米 定制版ninebot 九号平衡车哪个好 mysql 定时内存溢出是什么原因,每天两次,时间大体一致 山有海M1山地平衡车那电池可以用多久? 智能平衡车是给残疾人使用的吗? 最近两轮的平衡车很风靡,居然都上快乐大本营了,那个车怎么样啊?给介绍一下哦!! 在sql上面删除mysql的数据(通过链接服务器连接的),系统是win7 ,sql... 哪里买robstep电动平衡车m1原装电池 csgo沙鹰新检视动作如何触发 看快乐大本营,记得有一款平衡车,听朋友说是易步车来的,尤其是看预告,女神刘亦菲也在骑,很想买啊。 去北京好玩玩具店做地铁怎么走 M1N1迷你平衡车开关不起作用,总是处锁车状态。怎么解决 湖南省怀化南站去大型玩具店怎么走 使用mysql-connector c++编写代码,运行失败,内存溢出。 我想开一家玩具店.卖毛绒玩具.公仔.模型.手办之类的东西.我应该去哪里进货?请告诉我做车路线 java 向数据库添加大量数据时内存溢出 在不改变内存的情况下如何解决...