mysql 执行查询_MySQL执行一个查询的过程

总体流程

客户端发送一条查询给服务器;

服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果。否则进入下一阶段;

服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划;

MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询;

将结果返回给客户端。

e9598af13265f024a2a46a1f035a007f.png

MySQL客户端/服务器通信协议

1.MySQL客户端和服务器之间的通信协议是“半双工”:在任何一个时刻,要么由服务器向客户端发送数据,要么由客户端向服务器发送数据。这也就意味着没法进行流量控制。

6b780da5726c4218fd87f509b703c4db.png

在任何时刻,只有一个人能控制球,而且只有控制球的人才能将球抛出去。

2.多数连接MySQL的库函数都可以获取全部结果集并缓存到内存里,还可以逐行获取需要的数据。默认一般是获取全部结果集并缓存到内存中。MySQL通常需要等所有的数据都发送给客户端才能释放这条查询所占用的资源。

查询缓存

在解析一个查询语句之前,如果查询缓存是打开的,那么MySQL会优先检查这个查询是否命中查询缓存中的数据。

8af2b96f01e656287699b84663cbd168.png

查询优化处理

查询的生命周期的下一步是将一个SQL转换成一个执行计划,MySQL再依照执行计划和存储引擎进行交互。包括多个子阶段:解析SQL、预处理、优化SQL执行计划。

31eb4b7344a5028f70af61c4fb99b1b4.png

MySQL执行关联查询

查询策略:MySQL对任何关联都执行嵌套循环关联操作,即MySQL会在一个表中循环取出单挑数据,然后再嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为为止。然后根据各个表匹配的行,返回查询中需要的各个列。(类似for循环嵌套)

2af2177e727abdbffda09721e9724060.png

MySQL多表关联(左侧深度优先树)

2f08247d058cf16b5b0c13a645c9ce68.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值