如图,分为server与存储引擎两层。
从图中不难看出,不同的存储引擎共用一个 Server 层,也就是从连接器到执行器的部分。
如果不指定存储引擎默认使用innodb。
连接器
负责与客户端建立连接,进行用户名密码认证,认证后获得权限。对权限的修改只会在重新登陆后生效。
连接长时间不使用会自动断开。
长连接可以减少连接创建销毁的开销,但是mysql执行过程中临时使用的内存会越来越多,导致占满内存,可能会被系统杀掉(OOM)。
解决方法:
1、定期断开长连接
2、mysql_reset_connection
查询缓存
执行相同的sql会使用缓存,但是对表的修改会使缓存失效(不好用)。mysql 8.0移除
分析器
词法分析->语法分析
优化器
1、多个索引决定用哪个索引
2、多表关联(join)决定表的连接顺序
执行器
查询之前先判断权限
mysql> select * from T where ID=10;
执行过程(ID不是索引):
1、调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;
2、调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
3、执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
如果有索引,调用”获取满足条件的第一行“接口和"满足条件的下一行接口"。
课后思考:sql中使用了不存在的列,在哪一步报错?
答案:分析器