加入收藏 | 设为首页 | 会员中心 | 我要投稿 航空爱好网 (https://www.52kongjun.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL数据查询太多会咋样

发布时间:2022-06-18 10:18:02 所属栏目:MySql教程 来源:互联网
导读:主机内存只有100G,现在要全表扫描一个200G大表,会不会把DB主机的内存用光? 逻辑备份时,可不就是做整库扫描吗?若这样就会把内存吃光,逻辑备份不是早就挂了? 所以大表全表扫描,看起来应该没问题。这是为啥呢? 全表扫描对server层的影响 假设,我们现
  主机内存只有100G,现在要全表扫描一个200G大表,会不会把DB主机的内存用光?
 
  逻辑备份时,可不就是做整库扫描吗?若这样就会把内存吃光,逻辑备份不是早就挂了?
 
  所以大表全表扫描,看起来应该没问题。这是为啥呢?
 
  全表扫描对server层的影响
 
  假设,我们现在要对一个200G的InnoDB表db1. t,执行一个全表扫描。当然,你要把扫描结果保存在客户端,会使用类似这样的命令:
 
  mysql -h$host -P$port -u$user -p$pwd -e
   "select * from db1.t" > $target_file
  InnoDB数据保存在主键索引上,所以全表扫描实际上是直接扫描表t的主键索引。这条查询语句由于没有其他判断条件,所以查到的每一行都可以直接放到结果集,然后返回给客户端。
 
  可见:
 
  一个查询在发送过程中,占用的MySQL内部的内存最大就是**「net_buffer_length」**这么大,不会达到200G
  socket send buffer 也不可能达到200G(默认定义/proc/sys/net/core/wmem_default),若socket send buffer被写满,就会暂停读数据的流程
  所以MySQL其实是“边读边发”。这意味着,若客户端接收得慢,会导致MySQL服务端由于结果发不出去,这个事务的执行时间变长。
 
  比如下面这个状态,就是当客户端不读**「socket receive buffer」**内容时,在服务端show processlist看到的结果。

(编辑:航空爱好网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!