一文读懂一条 SQL 查询语句是如何执行的( 二 )


需要注意的是 , 在 MySQL 5.1 及之前的版本 , MyISAM 是默认的存储引擎 , 而在 MySQL 5.5.5 后 , InnoDB 成为了默认的存储引擎 。
MySQL 5.7 的官方文档中 , 是这样描述连接器答:
MySQL Connectors provide connectivity to the MySQL server for client programs.
MySQL 连接器为客户端程序提供到 MySQL 服务器的连接 。说得更细节一点的话 , 连接器其实会做两个事情 , 一个是管理 MySQL 连接 , 一个是权限验证 。 我们依次来解释下 。
首先 , 要连接到 MySQL 服务器 , 我们通常需要提供 MySQL 用户名和密码 , 并且如果服务器运行在我们登录的机器以外的机器上 , 还需要指定一个主机名比如 host 。所以连接命令一般是这样的:
shell> mysql -h host -u user -pEnter password: ******** shell> mysql -u user -p 上面这个命令各位应该都很熟悉 。
OK , 通过上述命令完成经典的 TCP 三次握手建立连接后 , 连接器就会根据你输入的用户名和密码来认证你的身份:
1)如果用户名或密码不对 , 你就会收到一个 "Access denied for user" 的错误 , 然后客户端程序结束执行 。
2)如果用户名密码认证通过 , 你会看到下面这一串内容:
一文读懂一条 SQL 查询语句是如何执行的
本文插图
mysql> 就是在提示你 MySQL 已准备好了 , 你可以开始输入 SQL 语句了!
当然 , 连接器做的事情不仅仅是比对一下用户名和密码 , 它还会验证该用户是否具有执行某个特定查询的权限(例如 , 是否允许该用户对 world 数据库的 Country 表执行 SELECT 语句) 。 之后 , 这个连接里面的所有权限判断逻辑 , 都将依赖于此时读到的权限 。
这意味着 , 当一个用户成功建立连接后 , 即使你在另一个终端用管理员账号对这个用户的权限做了修改 , 对当前已经存在连接的权限不会造成任何影响 。
也就是说 , 当修改了用户权限后 , 只有再新建的连接才会使用新的权限设置 。
当一个连接建立起来后 , 如果你没有后续的动作 , 那么这个连接就处于空闲状态(Sleep) 。
事实上 , 对于一个 MySQL 连接来说(或者说一个线程) , 任何时刻都有一个状态 , 该状态表示了 MySQL 当前正在做什么 。 有很多种方式能查看当前的状态 , 最简单的是使用 SHOW FULL PROCESSLIST 命令(该命令返回结果中的 Command 列就表示当前的状态) 。
一文读懂一条 SQL 查询语句是如何执行的
本文插图
在一个查询的生命周期中 , 状态会变化很多次 。 这里就不详细列出来了 , 上图中的 Sleep 状态就是说当前连接正在等待客户端发送新的请求 , Query 状态表示当前连接正在执行查询或者正在将结果发送给客户端 。