01 | 基础架构:一条SQL查询语句是如何执行的?
Page content
01 | 基础架构:一条SQL查询语句是如何执行的?
MySQL的基本架构是什么样子的
分为客户端、server层和引擎层,其中引擎层是插件式的,server层的模块包括连接器、查询缓存、分析器、优化器、执行器
连接器的主要功能是什么
负责与客户端建立连接、获取权限、维持和管理连接
修改用户的权限后什么时机生效
连接建立后,连接器会去权限表获取你拥有的权限,之后的权限判断都依赖此时获取到的权限,所以修改用户的权限并不会对已经建立的连接产生影响。
为什么更加建议使用长连接
连接的建立是一个复杂的过程,如果频繁的建立连接,会影响性能
长连接可能会导致哪些问题且如何解决这些问题
- MySQL 在执行过程中临时使用的内存是管理在连接对象里面的,连接断开的时候才会被释放,如果长连接过多会导致内存占用过大。
- 解决方案有两个:(1)定期断开长连接;(2)MySQL5.7 及以后的版本,可以在每次执行一个较大的操作后执行一次
mysql_reset_connection
来初始化连接资源,此操作不会重连也不会重新做权限校验,只是将连接初始化到刚刚建立时的状态
查询缓存的功能是什么、它是如何工作的
查询语句被作为 key,查询结果被作为 value,以 key-value的形式缓存到内存中,这样如果一个查询语句已经存在于内存中,结果可以被直接返回
为什么不建议使用查询缓存
查询缓存会频繁失效,缓存命中率特别低,整体来说弊大于利;除非查询的表是一个静态表;
分析器的功能是什么
判断要做什么 进行词法分析、语法分析,判断输入的 SQL 语法是否正确
优化器的功能是什么
决定该怎么做 索引选择、多表关联(join)的时候决定表的连接顺序,目的是为了以最快的方式获取数据;
执行器的功能是什么
真正去做 做之前要判断是否有足够的权限,权限足够,调用引擎提供的接口获取数据 (命中查询缓存的情况下,在返回结果前会做权限验证;查询也会在优化器之前调用precheck验证权限)
思考题
问题: 如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?
答案: 分析器