前言
MySQL数据库作为优秀的关系型开源数据库,受到所有人的青睐,我们日常工作中,和其打交道的次数十分频繁,那么你知道我们在写sql的时候,MySQL内部是如何执行的吗?接下来我们就一起探讨一下吧。
MySQL的架构
以 select * from T where ID=10; 这条sql语句为例:
当我们执行该查询语句时,会收到MySQL给我们返回的结果,那么其在MySQL中是如何一步步执行的呢?
首先我们了解一下MySQL的架构图,看一下MySQL服务的组织结构:
如上图所示:
MySQL大致可以分为 Server 层和存储引擎层两部分。
Server 层包括连接器、查询缓存、分析器、优化器、执行器等,以及所有内置的函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,如存储过程、触发器、视图等。
存储引擎层则负责数据的存取。架构是插件式的,支持 InnoDB、MyISAM、Memory等多个存储引擎。MySQL 5.5.5版本之后,其默认存储引擎为InnoDB。
所有的存储引擎共用一个Server层。
预埋问题:memory 引擎和 redis 两者的区别
连接器
平时我们命令行连接MySQL数据库时的命令为:
mysql -h127.0.0.1 -P6293 -uroot -p
这条命令就是走到了连接器去验证用户身份。
其中命令中的 mysql 是客户端工具,用来和服务端建立连接。在完成TCP握手之后,连接器开始使用输入的参数信息进行身份认证。
如果用户名或密码不正确,会有一个 Access Denied for user 的错误,客户端中断。
如果验证通过,连接器会到权限表里面查出用户权限并存在变量中。之后该连接里面的权限判断逻辑,都将依赖于此时读取到的权限。
此时我们应该就会理解,为什么我们给某个用户修改了权限之后,已经存在的该用户的连接不会变更为新的权限。要想新的权限生效