本文将带你揭开MySQL Server层的神秘面纱,逐一剖析连接器、查询缓存、分析器、优化器、执行器等关键组件的功能和作用。同时,还将重点介绍这些组件在权限校验方面的精彩表现。
首先来看一下这张思维导图,对本文内容有个直观的认识。
接下来进入正文。
MySQL SQL语句执行流程示意图:
从中你可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。
大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等,未来我们接触索引失效的时候,就知道为什么不允许在where条件中对字段使用函数,),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。
连接器
连接器负责建立和管理与客户端的连接,获取权限并管理连接。连接命令一般是这么写的:
Java复制代码mysql -h$ip -P$port -u$user -p
为了安全起见,在交互对话中输入密码比直接在命令行中写密码更可靠。请避免在命令行中明文输入密码,尤其是在连接生产服务器时。
使用客户端工具(如mysql命令)连接到MySQL服务端后,在完成经典的 TCP 握手后,连接器会进行身份认证,使用你提供的用户名和密码进行验证。
- 如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。
- 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。
对于已经建立的连接,