01 | 基础架构:一条SQL查询语句是如何执行的?
林晓斌
该思维导图由 AI 生成,仅供参考
你好,我是林晓斌。
这是专栏的第一篇文章,我想来跟你聊聊 MySQL 的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个 ID 字段,在执行下面这个查询语句时:
我们看到的只是输入一条语句,返回一个结果,却不知道这条语句在 MySQL 内部的执行过程。
所以今天我想和你一起把 MySQL 拆解一下,看看里面都有哪些“零件”,希望借由这个拆解过程,让你对 MySQL 有更深入的理解。这样当我们碰到 MySQL 的一些异常或者问题时,就能够直戳本质,更为快速地定位并解决问题。
下面我给出的是 MySQL 的基本架构示意图,从中你可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。
MySQL 的逻辑架构图
大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。
Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
这篇文章深入介绍了MySQL的逻辑架构和SQL查询语句在MySQL内部的执行过程。首先,文章详细解释了连接器、查询缓存和分析器在SQL查询语句执行过程中的作用,以及长连接和短连接的区别。接着,通过优化器和执行器阶段的处理,阐述了MySQL如何确定执行方案并开始执行语句。执行器根据表的引擎定义,使用引擎提供的接口执行查询,同时介绍了在有索引的表和无索引的表中执行的逻辑。最后,总结了MySQL的逻辑架构和SQL语句执行流程的各个阶段,为读者提供了初步印象。整篇文章通过拆解MySQL的基础架构和解释SQL查询语句的执行过程,帮助读者更深入地理解MySQL的内部工作原理。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 实战 45 讲》,新⼈⾸单¥68
《MySQL 实战 45 讲》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(997)
- 最新
- 精选
- 林晓斌置顶感谢大家的积极评论。 答案是分析器。 @threefat 提到Oracle,MySQL确实在设计上受Oracle影响颇深。 @圈圈圆圆 高性能MySQL里面概念学得好。 @Yezhiwei 等几位,说正文里面已经暗示答案的同学,你们这么机智👍🏿 后面每期的问题,我们会在下一期的结尾的给出解释,不过只是“参考”哦,以评论区的质量,我估计到时候只需要引用优秀评论就好了 ^_^2018-11-1610764
- threefat置顶课后答案:分析器。Oracle会在分析阶段判断语句是否正确,表是否存在,列是否存在等。猜测MySQL也这样。
作者回复: MySQL确实在设计上受Oracle影响颇深。就是这样哈,分析器做了这个工作。另外有评论里面举例高性能MySQL 里面概念的同学、说正文里面已经暗示答案的同学,远程点赞了哈😄😄 就喜欢你们这么机智的回答👍🏿
2018-11-147370 - 李志博置顶应该是分析器吧,老师我还有个问题,如果有memory 引擎,还有redis 存在的必要吗,应该是有的吧,两者的场景?
作者回复: 这个后面专门有一篇《要不要用memory引擎》会说明,先说结论,redis很有必要😄
2018-11-1413111 - 奕置顶我认为是优化器的,优化器会进行优化分析,比如用先执行哪个条件,使用哪个索引。如果没有对应的字段就会报错的,我看其他评论说是执行器,原因是这个时候才打开表获取数据,但是表的字段不是数据啊,是事先定义好的,所以可以直接读取的,不需要打开表。这是我的看法,希望老师点评一下是否正确
作者回复: “不是执行器”这一点,你分析得很好😄
2018-11-1421279 - 郭有个问题不太明白,为什么对权限的检查不在优化器之前做?
作者回复: 有些时候,SQL语句要操作的表不只是SQL字面上那些。比如如果有个触发器,得在执行器阶段(过程中)才能确定。优化器阶段前是无能为力的
2018-11-1426429 - 尼古拉斯·赵四我创建了一个没有select权限的用户,执行select * from T where k=1,报错“select command denied”,并没有报错“unknown column”,是不是可以说明是在打开表之后才判断读取的列不存在?
作者回复: 这个是一个安全方面的考虑。你想想一个用户如果没有查看这个表的权限,你是会告诉他字段不对还是没权限?如果告诉他字段不对,其实给的信息太多了,因为没权限的意思还包含了:没权限知道字段是否存在😄
2018-11-1434392 - WL为该讲总结了几个问题, 大家复习的时候可以先尝试回答这些问题检查自己的掌握程度: 1. MySQL的框架有几个组件, 各是什么作用? 2. Server层和存储引擎层各是什么作用? 3. you have an error in your SQL syntax 这个保存是在词法分析里还是在语法分析里报错? 4. 对于表的操作权限验证在哪里进行? 5. 执行器的执行查询语句的流程是什么样的?
作者回复: 非常好👍🏿
2018-11-2417336 - 深藏Blue入手比较晚,说下个人对为什么是分析器的看法。 连接器:门卫,想进请出示准入凭证(工牌、邀请证明一类)。“你好,你是普通员工,只能进入办公大厅,不能到高管区域”此为权限查询。 分析器:“您需要在公司里面找一张头发是黑色的桌子?桌子没有头发啊!臣妾做不到” 优化器:“要我在A B两个办公室找张三和李四啊?那我应该先去B办公室找李四,然后请李四帮我去A办公室找张三,因为B办公室比较近且李四知道张三具体工位在哪” 执行器:“好了,找人的计划方案定了,开始行动吧,走你!糟糕,刚门卫大哥说了,我没有权限进B办公室”
作者回复: 哈哈,很不错,有意思啊👍
2019-01-1712226 - yezhizi源码安装完MySQL之后,使用Debug模式启动 mysqld --debug --console &后, mysql> create database wxb; Query OK, 1 row affected (0.01 sec) mysql> use wxb; Database changed mysql> create table t(a int); Query OK, 0 rows affected (0.01 sec) mysql> select * from t where k=1; ERROR 1054 (42S22): Unknown column 'k' in 'where clause' T@4: | | | | | | | | | error: error: 1054 message: 'Unknown column 'k' in 'where clause'' Complete optimizer trace: 答案就很清楚了
作者回复: 嗯嗯,Trace 日志是个好东西
2018-11-1410153 - 易轻尘靠着耐心翻完所有留言以后,强烈建议极客时间app出一个回到顶部的功能! 另外总结一下在评论中看到的问题的解答 1. 连接器是从权限表里边查询用户权限并保存在一个变量里边以供查询缓存,分析器,执行器在检查权限的时候使用。 2. sql执行过程中可能会有触发器这种在运行时才能确定的过程,分析器工作结束后的precheck是不能对这种运行时涉及到的表进行权限校验的,所以需要在执行器阶段进行权限检查。另外正是因为有precheck这个步骤,才会在报错时报的是用户无权,而不是 k字段不存在(为了不向用户暴露表结构)。 3. 词法分析阶段是从information schema里面获得表的结构信息的。 4. 可以使用连接池的方式,将短连接变为长连接。 5. mysql_reset_connection是mysql为各个编程语言提供的api,不是sql语句。 6. wait_timeout是非交互式连接的空闲超时,interactive_timeout是交互式连接的空闲超时。执行时间不计入空闲时间。这两个超时设置得是否一样要看情况。
作者回复: 👍 “回到顶部”这个需求很有画面感啊 😆
2019-05-101089
收起评论