MySQL执行一条SQL查询语句,期间发生了什么?

MySQL作为最流行的关系型数据库之一,尤其受到各面试官的青睐。今天我们就带来解答这个问题,了解下MySQL的基本架构。相比于直接看别人的优秀设计,我们不妨停下来先思考一下,如果你是MySQL的开发人员,会如何设计MySQL的基本架构呢?之后,把自己的设计与MySQL的基本架构做对比,这样更容易理解MySQL为什么这么设计,也能在学习、对比和思考中提高自己的架构设计能力。

我们可以考虑下MySQL要支持的查询需求:多个客户端同时连接到MySQL,用SQL语句去增删改查数据,针对查询场景,MySQL要保证尽可能快地返回客户端结果。

了解了这些需求场景,我们可能会对MySQL进行如下设计:

其中,连接器管理客户端的连接,负责管理连接、认证鉴权等;查询缓存则是为了加速查询,命中则直接返回结果;SQL解析器负责解析SQL翻译为执行器识别的内容;执行器则负责从具体存储中拿到数据并返回。

MySQL的基本架构整体也大致如此,不过要比这个要复杂很多,SQL执行、数据存储引擎层面,还有诸多优秀的细节,比如binlog机制、InnoDB存储引擎的锁、事务机制等,共同成就了卓越的MySQL。

各组件的功能主要是:

1、连接器

管理客户端的连接,并负责权限验证。当用户通过客户端发送一条SQL查询语句时,首先,MySQL服务器会验证客户端的连接信息(如用户名、密码),建立连接。连接成功后,服务器才会SQL查询语句。

MySQL也提供了最大连接数、连接超时等一系列参数设置来控制客户端连接行为。

2、查询缓存

如果一个查询请求被执行过,MySQL会把执行结果存入查询缓存,如果后面又查询了同样的语句,则会直接返回结果。但是,查询缓存会因为更新频繁失效,因为只要一个表有更新操作,那么这个表的查询缓存就会被清空。

这样就显得很鸡肋,我们可以通过将参数 query_cache_type 设置成 DEMAND,来关闭查询缓存。

需要指出,MySQL 8.0版本直接将查询缓存的整块功能删掉了,8.0开始彻底没有这个功能了。

3、SQL解析器

SQL解析器会分析SQL语句的语法结构,做词法和语法分析,检查其是否符合SQL语法规范。如果不符合,将返回错误信息。之后构建出语法树。

mysql> selec * from t where ID=1;

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 'selec * from t where ID=1' at line 1
4、预处理器

预处理器进一步检查SQL语句中的表名、列名是否存在,把 select * 替换为具体的列,以及用户是否有相应的访问权限。

5、优化器

优化器根据表的数据分布、索引等信息,选择最优的执行计划。这一步骤对于提高查询效率至关重要。

优化器可能会重写查询语句,比如转换JOIN顺序,选择最合适的索引等。

6、执行器

查询执行引擎根据优化后的执行计划,调用存储引擎的API 执行实际的数据读取或修改操作,包括主键索引查询,索引下推等。

如果查询涉及多个表,MySQL会使用相应的算法(如嵌套循环、哈希连接)进行表的连接操作。

之后,查询结果被收集并格式化,然后通过网络返回给客户端。如果查询结果太大,可能会采用分批次的方式返回。

结语

理解MySQL执行SQL查询的内部机制,不仅有助于日常开发中的性能优化,也是在面试中展现深厚技术功底的关键。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

missterzy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值