欢迎关注MySQL专栏MySQL历险记
强烈主张收藏本导航文【MySQL历险记】MySQL的核心特性汇总
前语
常言道,看待一个事情要先知全貌,从高维度知道、了解,然后再深入各个细节,逐个击破。MySQL的学习也不例外,那么你知道一条SQL在MySQL中履行要阅历哪些进程吗?每个进程都有MySQL的哪些“零件”参与吗?假如不清楚的话,能够阅读本文。
SQL履行流程
在MySQL客户端或者JAVA应用程序中查询一条最简略的句子比方select * from T where ID =10;
你知道阅历哪些进程吗?
衔接
你要履行查询句子前肯定要先和MySQL树立衔接啊,那怎样树立衔接呢?
能够经过下面的指令:
mysql -h ip -P port -u$user -p
- 经过三次握手树立衔接成功后, 验证客户端传来的衔接用户名和暗码,并不是任何阿猫阿狗都能够连啊
- 假如用户名或暗码不对,会收到一个
Access denied for user
过错,客户端程序完毕履行 - 用户名暗码认证经过,会从权限表查出账号拥有的权限与衔接相关,之后的权限判别逻辑,都将依赖于此刻读到的权限
这个用于衔接的“零件”便是MySQL的衔接器,它首要担任跟客户端树立衔接、获取权限、保持和办理衔接。
查缓存
现在衔接树立好了,相当于客户端和MySQL服务端的“传输管道”有了,开端查数据了。
都说功能不够,缓存来凑,MySQL“为了功能”,也完成了查询缓存。
- MySQL以查询的句子作为key去查询缓存中获取对应的value
- 假如没有的话,会去做真实的查询
- 假如有的话,直接回来缓存中的数据
- 假如这个表产生更新,查询缓存会清空
所以要害点在于MySQL表的更新频率以及缓存的射中率,咱们能够依据下面指令检查监控查询缓存:
show status like '%Qcache%';
-
Qcache_hits:
表明有多少次射中缓存
。咱们首要能够经过该值来验证咱们的查询缓存的作用。数字越大,缓存作用越理想。 -
Qcache_inserts:
表明多少次未射中然后插入
,意思是新来的SQL恳求在缓存中未找到,不得不履行查询处理,履行查询处理后把成果insert到查询缓存中。这样的情况的次数越多,表明查询缓存应用到的比较少,作用也就不理想。当然系统刚启动后,查询缓存是空的,这也正常。
这上面一个进程便是MySQL的查询缓存操作。
但是实际情况是查询缓存往往弊大于利,由于查询缓存的失效十分频繁,一般主张咱们在静态表里运用查询缓存。但是在MySQL 8.0中现已去掉了查询缓存。
剖析验证
假如没有射中查询缓存,就要开端真实去查了。在查询前,MySQL肯定要“了解”你这条SQL句子啊,所以要有个“零件”去剖析验证你的SQL句子,那究竟是怎样个剖析进程呢?
- 词法剖析, 你输入的是由多个字符串和空格组成的一条 SQL 句子,MySQL 需求识别出里边 的字符串别离是什么,代表什么。
- 语法剖析,依据词法剖析的成果,语法剖析器会依据语法规则,判别你输入的这个SQL句子是否满足 MySQL语法。
这也是为什么咱们的SQL句子存在语法问题的时分会报错,便是这个叫做剖析器的零件报出来的。
优化
语法没问题,就够了吗?当然不够,智能的MySQL还要帮咱们做优化,那都做哪方面的优化呢?
- 比方有多个索引的时分,智能选择一个它以为最佳的索引
- 多表相关的时分,决议表的衔接顺序
- 对子查询进行优化
- 对衔接语义进行了外衔接消除、嵌套衔接消除….
这个进程便是由MySQL的优化器做的。
履行
优化器阶段完成后,这个句子的履行方案就确认下来了,然后真实的开端履行了。
在履行之前需求判别该用户是否具有权限 。假如没有,就会回来权限过错。假如具有权限,就履行 SQL 查询并回来成果。
咱们以一开端的查询句子select * from T where ID =10;
为例,ID没有索引,并且选用的innoDB
作为存储引擎,整体查询的流程如下:
- 调用
InnoDB
存储引擎接口取这个表的第一行,判别 ID 值是不是1 - 假如不是则跳过
- 假如是则将这行存在成果会集
- 调用引擎接口取“下一行”,重复相同的判别逻辑,直到取到这个表的最终一行。
上述遍历进程中一切满足条件的行组成的记录集作为成果集回来给客户,这一个进程便是由MySQL的履行器履行的。
MySQL逻辑架构
上面讲解了查询句子的端的履行流程,触及了MySQL的各个“零件”,咱们将这些零件组装组装,能够构成下面的逻辑架构图:
大体来说,MySQL能够分为Server层和存储引擎层两部分。
- Server层包含衔接器、查询缓存、剖析器、优化器、履行器等,包括 MySQL 的大多数核心服务功能,以及一切的内置函数(如日期、时间、数学和加密函数等),一切跨存储引擎的功能都在这一层完成,比方存储进程、触发器、视图等。
-
存储引擎层担任数据的存储和提取。其架构模式是插件式的,支持
InnoDB
、MyISAM
、Memory
等多个存储引擎。一切的存储引擎都共用同一个Server层。
总结
本文经过以一个查询句子的履行流程为例,讲解了MySQL整体的逻辑架构,对MySQL的各个部分有了一个全局的认知。这样,在遇到问题的时分,也比较有针对性,比方关于一个select * from T where k=1
,报了Unknown column ‘k’ in ‘where clause’
的过错,咱们就很快的知道是剖析器报出来的,由于剖析器会剖析咱们SQL的语法。
假如本文对你有帮助的话,请留下一个赞吧
本文正在参加「金石计划 . 分割6万现金大奖」