多平台统一管理软件接口,如何实现多平台统一管理软件接口
228
2022-11-05
Mysql 45讲学习笔记(三十三)全表扫描为啥不会OOM(out of memory)
一.全表扫描server层如何执行
使用场景:
我们现在要对一个200G的InnoDB表执行全表扫描:
mysql -h$host -P$port -u$user -p$pwd -e "select * from db">$target_file
取数据和发数据的流程:
获取一行,写到net_buffer中,这块内存的大小是由参数net_buffer_length定义,默认16k重复,知道16k写满,网络接口发送出去,并清空缓存直到函数返回EAGAIN 或 WSAEWOULDBLOCK,表示本地网络栈(socket send buffer)写满了,表示本地网络栈写满了,进入等待。直到网络栈重新可写,继续发送。
MySQL 是“边读边发的”---流式客户端接收 慢,导致MySQL服务端结果发布出去 ,事务执行时间变长
二.全表扫描对InnoDB
Buffer Pool两个作用:
加速更新加速查询 (查询不需要读磁盘,直接从内存中取结果)
内存命中率
查看方式:
show engine innodb status结果,查看系统当前的BP命中率
InnoDB Buffer Pool的大小由参数innodb_buffer_pool_size,一般建议设置成可用物理内存60%-80%
Buffer Pool如何淘汰数据
三.Least Rencently Used--LRU算法
淘汰最久未使用数据
存在问题:
全表扫描的时候,Buffer Pool 里的数据全部淘汰掉,存入扫描过程中访问到的数据页的内容此时,业务数据进来会导致内存命中率急剧下降,磁盘压力增加,SQL 语句响应变慢
解决方案:
改进版LRU算法---为全表扫描的操作量身定制
利用特点:该数据页只会全表扫描的时候被 访问间隔不会超过 1 秒 -----控制LRU认定最近条件即可
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~