MySQL基础架构
MySQL分为Server层和存储引擎层。
Server层包括连接器、查询缓存、分析器、优化器、执行器等。
存储引擎层负责数据的存储和提取,支持多种存储引擎。
Server:
连接器:负责与客户端建立连接,获取权限。
权限:登录成功的同时会获得权限,意味着如果用户登录之后对该用户修改权限,新建连接才会使用新权限,对当前正在使用的用户连接无效。
连接:连接默认断开时间为8小时,由于建立连接比较复杂,建议减少建立连接的动作,尽量使用长连接。
长连接的缺点:MySQL再执行过程中临时内存是管理再内存对象中的,资源只有当连接结束才会释放,长期累积占用内存。建议定期断开长连接或在执行大操作之后执行mysql_reset_connection初始化连接。
查询缓存:缓存查询结果,命中直接返回。
执行过的语句以及结果会以key-value存储在内存中,失效频繁所以不建议使用。静态、配置表可以使用,可以通过query_cache_type设置成按需使用,8.0版本整个模块删除。
分析器:词法分析,语法分析。
词法分析:分析语句中每个词所对应的含义,识别出关键字,字段,表名等。
语法分析:分析SQL是否满足语法,
优化器:优化处理,选择索引、表连接顺序等。
执行器:校验权限,调用引擎接口执行
调用引擎接口:
无索引情况下:调用引擎接口取第一条数据判断是否满足,满足存至结果集;调用引擎接口取下一行,重复判断到最后一行;将结果集返回客户端。
有索引情况下:调用引擎接口取满足条件的第一行,循环再取满足条件下的下一行。
rows_examined:表示语句执行过程中扫描了多少行,指的是执行器每次调用引擎接口获取数据行的累加。有些情况下执行器调用一次,再引擎内部扫描多行,这种情况下引擎扫描行数和rows_examined并不完全相同。
问题:
- 如果表T中没有K字段,而当执行select * from T where k = 1,会报不存在字段的错误,是在哪个阶段报出来的?
分析器阶段。
- 为何执行权限校验不在优化器之前做?
有些时候,SQL语句要操作的表不只是SQL显式指定的那些。比如有个触发器,就只有在执行器阶段才能确定。