33查大量数据会不会把数据库内存打爆
mysql -h$host -P$port -u$user -p$pwd -e “select * from db1.t” > $target_file
show processlist
- Sending to client
表示服务器端的网络栈写满,返回结果集太大,让业务开发同学优化查询结果,并评估这么多的返回结果是否合理
可调大net_buffer_length
innoDB内存管理
内存的数据页是在 Buffer Pool (BP) 中管理
WAL里Buffer Pool起到了加速更新的作用,还有一个更重要的作用,就是加速查询
命中率:show engine innodb status,Buffer pool hit rate
InnoDB Buffer Pool 的大小是由参数 innodb_buffer_pool_size,建议设置成可用物理内存的 60%~80%。
改进版最近最少使用 (Least Recently Used, LRU) 算法
解决全表扫描造成的缓存淘汰问题。
在InnoDB实现上,按照5:3的比例把整个LRU链表分成了young区域和old区域。图中LRU_old指向的就是old区域的第一个位置,是整个链表的 5/8 处。也就是说,靠近链表头部的5/8是young区域,靠近链表尾部的3/8是old区域。
- 图 7 中状态 1,要访问数据页 P3,由于 P3 在 young 区域,因此和优化前的 LRU 算法一样,将其移到链表头部,变成状态 2。
- 之后要访问一个新的不存在于当前链表的数据页,这时候依然是淘汰掉数据页 Pm,但是新插入的数据页 Px,是放在 LRU_old 处。
- 处于 old 区域的数据页,每次被访问的时候都要做下面判断
若这个数据页在 LRU 链表中存在的时间超过了 1 秒,就把它移动到链表头部;
如果这个数据页在 LRU 链表中存在的时间短于 1 秒,位置保持不变。1 秒这个时间,是由参数 innodb_old_blocks_time 控制的。其默认值是 1000,单位毫秒。