MySQL实战45讲读后感:一条SQL查询语句是如何执行的?

一条SQL查询语句是如何执行的?


总结: 这一篇我收获了以下几点:

  • 一条SQL语句是如何在MySQL中执行的
  • SQL语句中经历的步骤是哪些,主要用来做什么。以及MySQL一些报错,是在哪一个步骤报的

1.一条SQL语句是如何在MySQL中执行的
SQL查询流程

2.SQL语句中经历的步骤是哪些,主要用来做什么。以及MySQL一些报错,是在哪一个步骤报的

  • "客户端"这个就不介绍了
  • 连接器”:管理连接,权限校验。如果用户名或者密码错误会报错“Access denied for user”,该连接为长连接,默认连接时场为8小时,由配置wait_timeout控制。
  • 查询缓存”:缓存是以Key-value对的形式保存,key是SQL语句,value则是SQL查询出来的结果,如果命中了缓存,那么会在返回结果的时候,做权限校验。
    建议经常修改和增加的表不要使用查询缓存,因为“查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有缓存都会被清空,这样导致缓存命中的几率就非常低”.。
  • 分析器”:对SQL进行语义解析,对MySQL中关键字的识别,识别之后,然后判断结果是否符合MySQL的语法,如果不符合则会抛出异常"You have an error in your SQL syntax"
  • 优化器”:在优化器执行之前也会验证权限,“优化器是在表里有多个索引时,决定使用哪个索引; 或者在一个语句关联(join)的时候,决定各个表的连接顺序(连接的顺序不同,执行的效率也会不一样)。例如:”
    mysql> select * from t1 join t2 where t1.c=10 and t2.d=20;
  • 执行器”: 执行SQL语句时会先判断你对这个表有没有执行权限,如果没有则会抛出异常"ERROR 1142 (42000): SELECT command denied to user ‘b’@‘localhost’ for table ‘T’"
select * from T where ID=10;
ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'

执行器根据表的引擎定义,去使用引擎提供的接口
比如我们这个例子中的表 T 中,ID 字段没有索引,那么执行器的执行流程是这样的:

  1. 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;
  2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
  3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端
    至此这个语句就执行完了

对于有索引的表,执行的逻辑也差不多。第一次调用的是“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。

PS:慢查询日志中看到的rows_examined的字段,表示这个语句执行过程中扫描了多少行,但是这个值并不是绝对的,因为在有些场景下执行器调用一次,在引擎内存则扫描了多行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值