乐趣区

关于mysql:原来一条select语句在MySQL是这样执行的

看到蒋老师的第一篇文章后就收货颇丰,真是句句戳中痛点。

令我记忆最深的就是为什么晓得了一个个技术点,却还是用不好?不论是蒋老师所说的 Redis 还是本系列要开展学习的 MySQL。

这是一个值得思考的问题,在大多数状况下,咱们间接上百度搜寻 MySQL 事务、MySQL 索引之类的词汇。

上述问题当然也是 MySQL 的几个外围问题之一,但如果咱们都在一直地学习这些大的方面,咱们怎么能力在学习某一个技能上有质的晋升。

借用蒋老师的话术:“很多技术人都有一个误区,就是只重视零散的技术,没有建设一个残缺的常识架构,不足零碎观,然而,零碎观却是至关重要的。在解决问题的时候,从某种意义上来说,领有零碎观,就意味着你有根据、有章法去定位并解决问题。”

如果你对这些话也深有体会,那就跟咔咔一起建设一套 MySQL 的常识框架,对于这种思维也是第一次实战,心愿大家多多提意见。

一、从宏观的角度剖析 MySQL

首先看一张经典图片

这幅图预计很多人都看到过,也是经典之作高性能 MySQL 里边的,如果有趣味能够先看一下电子版的(如须要电子版可分割咔咔),感觉本人能看进去了,再去买书也来的急。

闲话少说,进入正题。

上图的客户端能够间接了解为 PHP、Java 等。接下来,你会看到连贯、线程解决。这一部分并不是 MySQL 所特有的,而且大多数客户端、服务器都具备相似的构造。

因而,一般而言,MySQL 能够分为两层:Server 层和存储引擎层。

Server 层次要包含连贯层、查问缓存、分析器、优化器、执行器等重要模块组成,这一层还蕴含了 MySQL 外围 Api 局部,比方罕用的格式化工夫、加密等。

存储引擎大家都很相熟,因为在面试中不止一次的问过大家 Innodb、Myisam 存储引擎的不同。

所以想过没有,MySQL 为什么会有这么多的存储引擎呢?

所有技术起源于当下问题,同样在 MySQL 中也不例外。

MySQL 在存储引擎这一方面的架构是插件式的,即能够随便切换不固定,而且 MySQL5.5 版本存储引擎曾经默认为 Innodb。

二、一条 SQL 执行要通过多少艰难?

下图是咔咔之前培训时给发的材料

图中还有一个相熟的陌生人 查问缓存模块,该模块在 MySQL8.0 中已不存在。

对于该模块为何要被删除,后续的文章也将于大家交换。

首先,咱们将大抵理解当咱们执行一条 SQL 语句时,如何在这个架构图中运行。

2-1 连接器

mysql -u root -p连贯数据库命令,在执行之后,你将须要输出明码。当实现经典的 TCP 握手之后,连接器就开始发挥作用了。

如果码谬误时,则返回Access denied for user‘root‘@‘localhost‘(using password: YES,谬误编码 1045。

如果连贯信息均正确,则此时将依据你输出的用户拜访权限表来获取该用户的权限,此处必须分明,当你登录胜利后,即便其他人批改了你的权限,在这个连贯未断开之前你的权限是不会产生扭转的。

当你连贯实现之后,如果你始终不做任何事件,执行 show processlist 将会看到一个 sleep,示意空连贯。

那么你晓得在 MySQL 中,如果连贯胜利后没有进行任何操作,多久会被主动中断?

能够执行 show variables like 'wait_timeout'; 用于查看工夫。

在 MySQL 中如果没有特地阐明,那么所有的工夫都是以秒为单位的,依据工夫转换能够得悉空连贯继续 8 小时。

2-2 查问缓存

你须要留神的是,MySQL8.0 曾经被勾销了,这个问题不止说了一次了,特地是那些正在应用 MySQL8.0 以下版本的小伙伴要留神哈!当你切换到 8.0 时候,遇到这个问题不晓得怎么解决。

MySQL8.0 为何勾销查问缓存模块

这个模块的设计,把查问语句作为 key,将后果作为 value 进行缓存,一旦这个表有更新,之前所有的缓存都会被革除掉。这就像你辛辛苦苦写的代码提交之后被他人笼罩一样好受。

MySQL8.0 以下的版本提供了一个参数 query_cache_type = enmand 来管制是否要应用查问缓存,在设置实现后,默认的 select 语句将不会被缓存。

如果的确能够应用局部场景,那么你能够将 sql_cache 增加到 select 关键字之后。

如果一条 select 语句之前被缓存过,那么后果集在这里就会间接返回,而没有缓存过的 select 语句就比拟辛苦了,还要持续本人的漫漫长路。

2-3 分析器

MySQL8.0 之前,它会在进入分析器之前判断是否缓存,在 MySQL8.0 之后,连接器验证胜利后就间接进入分析器。

分析器,依据字面意思来了解就是剖析要执行的 SQL 语句是什么,要做什么。

比方执行select * from user where id = 1

MySQL 首先依据 select 判断这是一个查问语句,而后将 user 辨认为表名,id 辨认为字段名,这个过程被称为 词法剖析

下一步,须要晓得该 SQL 的语法是否正确,进行 语法分析 ,如果语法不对你就会看到You have an error in your SQL syntax 谬误。通常,将在 use near 中找到该谬误。

2-4 优化器

到了这一步,MySQL 晓得你要做什么,然而要抉择最佳执行计划。

优化器都优化些什么?

举例来说:多个索引时抉择那个索引、多表关联时连贯程序。

当初你是否想晓得,优化器将优化多表关联的连贯程序,那在写 SQL 语句时是否就不用思考连贯程序呢?

当然不是,能让 MySQL 少做事件就少做,还是一个准则用小表驱动大表。

2-5 执行器

通过要做什么、怎么做后这条 SQL 语句才会真正的被执行,先进行权限验证,若没有权限则间接返回权限谬误,否则依据表定义的存储引擎,去应用对应引擎提供的接口。

三、总结

上图蕴含了注释的所有知识点,也是整个 MySQL 的大体执行流程图,前期文章都将围绕这几个要点开展。

保持学习、保持写作、保持分享是咔咔从业以来所秉持的信念。但愿文章在偌大的互联网上能给你带来一点帮忙,我是咔咔,下期见。

退出移动版