《丁奇-MySQL45讲-01》之归纳总结

时间:2021-03-06 15:02:24   收藏:0   阅读:0

01 | 基础架构:一条SQL查询语句是如何执行的?

技术图片

左侧图丁奇老师原本的图,右侧是个人理解所画的,按照在文中的理论来说,个人认为应该是先查询缓存,如果查不到才会进行词法分析,比如有一条SQL:select * from T where ID = 10;,先去缓存中以该条SQL为key开始查询缓存,如果没查询到才会开始解析该SQL,通过select关键词分析可以知道该条SQL是要做查询,既然是做查询,就要遵循查询语句的相关语法(也会在这一层判断表是否存在、列是否存在),所以通常SQL语法校验错误应该就是这一层实现的,语法校验通过后,MySQL还会帮你优化下SQL,比如哪里去掉重复的内容或者是不必要的语句甚至有可能是条件语句,这么做的道理当然是为了更快更好地执行完一条SQL,安排好执行计划后就开始执行了。

总的来说,MySQL分为Server、存储引擎层两部分。Server层包括连接器、查询缓存(MySQL移除了该功能)、分析器、优化器、执行器,涵盖MySQL的大多数核心服务,像经常使用的内置函数如时间,应该是去存储引擎获取完数据后在进行时间函数的执行;存储引擎负责数据的存储和读取,其架构模式是插件式的,也就是说MySQL可以有多种存储引擎,要是有可能,你自己也是可以开发的,最经常使用的便是InnoDB,InooDB在MySQL5.5.5版本后开始称为默认存储引擎。

ID不是索引:执行器调用存储引擎接口,存储引擎从磁盘上取T表的第一个数据页(丁奇老师文中写的是第一行,加上评论区大佬的分析,个人页认为是数据页,可能老师没表述清楚)返回给执行器,执行器拿到数据页后开始一个一个的判断ID是否等于10,如果不是就跳过,如果是就将其加入到结果集中,等该数据页遍历结束后,继续调用存储引擎的接口取T表的下一个数据页,重复上面的逻辑,直到取到T表的最后一个数据页。那么执行器怎么才知道当前数据页是否是T表的最后一页呢,个人理解应该会返回标志之类的,或者说存储引擎在最后一个数据页上加上标志即可,毕竟存储引擎知道是否是最后一页。

ID是索引:执行器带着ID = 10的参数调用存储引擎接口,存储引擎从磁盘索引树上找到ID = 10的第一个数据页返回给执行器,执行器直接放入到结果集中,接着继续调用存储引擎获取下一页。

以上两种场景的分析中加入了个人的理解,并不一定就是如此。两种场景的区别一方面是无索引场景下的判断是在Server层执行的,而有索引的是在存储引擎执行的,其实这也是有道理,通过索引查找到的数据一定是满足条件的,而索引也是存放在磁盘上的,也只有存储引擎能够读取磁盘的数据了;另外一方面是无索引场景下返回给执行器的数据页大小会比有索引下返回的数据页更大。丁奇老师文中对于这块有这么一个描述执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟rows_examined并不是完全相同的,个人认为是执行器每调用一次存储引擎返回的是数据页,而数据页不止包含一行数据,所以说存储引擎扫描了多行,而rows_examined(慢查询日志中可以看到该变量)表示执行器调用存储引擎的次数

唠嗑

不论是丁奇老师还是评论区的人都是大佬,一个比一个好问好学,关键都还解释到位,每次看完正文后还是刷好久的评论,一条一条的吸收,基本上一篇文章都是2个小时。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!