MySQL 取数和发送数据流程是”边读边发的“,具体流程如下:
- 获取一行,写到 net_buffer 中(由参数 net_buffer_length 设置,默认是 16k)
- 重复获取行,直到 net_buffer 写满,调用网络接口发出去。
- 如果发送成功,就清空 net_buffer,然后继续取下一行,并写入 net_buffer。
- 如果发送函数返回 EAGAIN 或 WSAEWOULDBLOCK,就表示本地网络栈(socket send buffer)写满了,进入等待。直到网络栈重新可写,再继续发送。
内存命中率,可以通过执行show engine innodb status,里面Buffer pool hit rate就是当前的命中率
InnoDB Buffer Pool 的大小是由参数 innodb_buffer_pool_size 确定的,一般建议设置成可用物理内存的 60%~80%。
InnoDB 内存管理用的是最近最少使用 (Least Recently Used, LRU) 算法,是用链表来实现的,按照 5:3 的比例把整个 LRU 链表分成了 young 区域和 old 区域。图中 LRU_old 指向的就是 old 区域的第一个位置,是整个链表的 5/8 处