连接器
作用
负责跟客户端建立连接、获取权限、维持和管理连接
流程
mysql -h$ip -P$port -u$user -p<br>
认证<br style="user-select: auto;">
空闲状态
超时退出wait_timeout: 8h
连接被断开之后,客户端再次发送请求
Lost connection to MySQL server during query
长连接
如果客户端持续有请求,则一直使用同一个连接
MySQL 占用内存涨得特别快<br style="user-select: auto;">
解决方案
定期断开长连接
通过执行 mysql_reset_connection 来重新初始化连接资源<br>
短连接<br>
指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个
查询缓存
查询流程
拿到一个查询请求后,会先到查询缓存看看
以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果
执行结果会被存入查询缓存中
优缺点
适用于系统配置表,更新少<br style="user-select: auto;">
不适用频繁表的更新,缓存会频繁失效<br style="user-select: auto;">
使用方式
按需使用<br>
将参数 query_cache_type 设置成 DEMAND<br>
select SQL_CACHE * from T where ID=10;
<span style="color: rgb(51, 51, 51); font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, "Segoe UI Emoji", sans-serif; font-size: 16px; orphans: 4; white-space: pre-wrap; user-select: auto;">8.0 没有这个功能了</span>
优化器
作用
决定使用哪个索引;<br style="user-select: auto;">
多表关联(join) 决定各个表的连接顺序
执行器<br>
流程<br>
判断执行权限
根据表的引擎定义,使用引擎接口<br style="user-select: auto;">
调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;<br style="user-select: auto;">
调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
慢查询日志中 字段rows_examined<br style="user-select: auto;">
表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。
问题
如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?