33.查数据太多,mysql有影响吗

47 阅读1分钟

全表扫描对server层的影响

如果数据表有200G,执行全表扫描,主键索引扫描的结果,每一行数据放到结果集中返回给客户端。

从server层读取数据到client

  • 获取一行,写到net_buffer中。这块内存的大小是由参数net_buffer_length定义的,默认是16k。
  • 重复获取行,直到net_buffer写满,调用网络接口发出去。
  • 如果发送成功,就清空net_buffer,然后继续取下一行,并写入net_buffer。
  • 如果发送函数返回EAGAIN或WSAEWOULDBLOCK,就表示本地网络栈(socket send buffer)写满了,进入等待。直到网络栈重新可写,再继续发送

image.png

边读边发

如果客户端接收得慢,会导致MySQL服务端由于结果发不出去,这个事务的执行时间变长。

全表扫描对Innodb引擎的影响

内存命中率是一个稳定的线上系统保证响应时间的要求,要在99%以上。

image.png

Innodb内存管理使用LRU算法,底层是链式结构,把要读的数据放在最前面。如果内存满了,插入一个新的节点,只有把最后一个节点淘汰掉,新节点放在头部。

image.png

Innodb新LRU算法

按照5:3的比例划分链表,左边是young区域,右边是old区域,8/5是我们经常访问的数据,剩下8/3是我们不常访问到。如果新插入一个节点,放在LRU_old位置,判断第一次访问和最后一次访问间隔没超过1秒,就留在old区域。

image.png

全表扫描会耗费IO资源,业务高峰期建议不要直接在线上主库执行全表扫描。