Mysql实战之一条SQL查询语句是如何执行的

1.前言

作为一位开发人员,必然要和mysql打交道,平常肯定也写各种各样的sql语句,下面咱们先来看一个非常简单的sql语句

select * from order  where id = 10;

我们看到这个sql,都会说,很简单的一个查询语句,执行结果是查询order表中id=10的所有数据,但是大家知道这个sql在Mysql内部是如何执行的吗?接下来,我就把一一给大家进行讲解,mysql的执行过程

3.Mysql的架构图

mysql架构图
mysql整体分为两层:Server层存储引擎层
其中Server层包括连接器、分析器、优化器、执行器等,包含了Mysql的大多数核心功能,以及所有的内置函数(比如日期,时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等
存储引擎层负责数据的存储和提取。存储引擎包括InnoDB、MyISAM等,目前最常用的存储引擎是InnoDB,在Mysql5.5.5.版本开始InnoDB就是默认存储引擎了

3.连接器

第一步,需要先连接到数据库上,这时候就是连接器在发挥作用,连接器负责跟客户端创建连接,获取权限、维持和管理连接。
连接数据的命令如下

mysql -h host -P port -u username -p password

输入完命令后,会出现交互式对话,让你输入密码,然后mysql客户端就会和mysql服务端建立连接,然后验证身份

  • 如果用户名或者密码不对,你就会收到一个"Access denied for user"的错误
  • 如果用户名或者密码验证通过,连接器就会通过权限表查询当前用户的权限,之后所有的操作都依赖该次查询到的权限

这也意味着如果这是修改了当前用户的权限,也不会影响之前已经连接成功的用户,只有连接中断,再重新连接才会生效。
mysql默认的连接超时时间为8小时,修改默认值可以通过wait_timeout参数。
因为每次数据库创建连接都比较好资源,所以建议使用长连接来保持数据库连接
名词解释
长连接:创建一次连接,后面的请求都使用同一个连接,不会创建新连接
短连接:每次请求都会创建一个新的连接
使用长连接存在的问题:当过多用户访问数据库的时候,会导致内存膨胀,最终产生OOM,让mysql宕机
解决方案:

  1. 定期断开长连接
  2. 如果发现比较大的请求时,执行完请求,刷新一下连接

4.查询缓存

连接建立完成后,就开始执行sql语句了,首先会执行查询缓存

执行sql语句会先走缓存,如果命中缓存,就直接返回结果,如果没有命中缓存,则继续往下执行

由于在mysql8.0之后查询缓存模块已经被删除,咱们也就不详细讲解这一块了

5. 分析器

如果没有命中缓存,就会走到分析器,分析器主要分为词法分析和语法分析。

分析器会先做词法分析。根据你输入的sql语句,进行关键词匹配语句类型,比如是查询、删除、修改还是新增语句,识别数据库表是否存,字段是否存在。
完成上面单词识别后,就会进行语法分析,会分析你的语法是否符合sql的规范,如果你的语句不对,就会收到”You have an error in your SQL syntax“的错误提示比如下面的语句from少打了一个f

select * orm t where id = 10
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select * orm t where id = 10' at line 1

一般错误都在use near附近

6.优化器

经过分析器之后,mysql就知道你要做什么了,但是在具体执行之前,还会针对你的sql语句进行优化
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
比如:

select * from t1 join t2 using(id) where t1.c=10 and t2.d=20
  • 既可以先从表t1里面取出c=10的记录的id的值,在根据id的值关联表t2,在判断t2里面d的值是否等于20
  • 既可以先从表t2里面取出d=20的记录的id的值,在根据id的值关联表t1,在判断t1里面c的值是否等于10

上面两种执行方法最终的结果是一样的,但是执行效率确不相同,优化器的作用就是决定使用哪一种执行方法。

优化器执行完成后,语句的执行就具体确定下来了,然后就会进入到执行器阶段了

7.执行器

mysql通过分析器知道了你要做什么,通过优化器知道了该怎么做,执行器就负责通过存储引擎执行sql了
比如:

select * from order where id = 10

首先验证是否存在有查询的权限,如果没有权限,则报错SELECT command denied to user ‘b’@‘localhost’ for table ‘order’
如果有权限,则会查找order表中所有id=10的数据

8.小结

本篇主要讲解了mysql的组成架构,和sql语句执行需要经过哪些阶段,希望可以通过本篇可以让你简单了解,一个sql语句的执行流程是什么样子的,后面的篇章会根据每个流程进行展开细聊,希望对你有所帮助,感谢您的阅读

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特特专属

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值