引言
在上一篇中,我们探讨了MySQL的体系结构的组成部分。主要由客户端、处理引擎、存储引擎组成
现在,我们来详细的分析一下处理引擎的作用。处理引擎相当于MySQL的大脑。他有三个非常重要的作用。
管理连接与线程
mysql是采用的多线程模型,使用线程池来管理数据库的连接。线程对象被放在一个线程池中重复利用,这样可以减少重复创建对象的开销。我们可以通过thread_cache_size来设定线程池的大小,让MySQL更好的利用已有的线程连接。
管理query cache:
query cache是mysql一个独有的设计。MySQL会利用之前的查询结果,直接缓存结果集。简单来说,原理类似于将SQL语句和结果集作为一个个key-value键值对存储起来。如果下次有同样的查询语句,且数据库没有发生变化。MySQL并不会访问实际的表,而是会直接返回之前的结果集。注意这里的“同样的语句”即要完全一样,一个字都不能差。合理的利用query cache会得到很好的性能,当然,测试性能时query cache会带来些困扰,可以用 sql_no_cache hint 屏蔽
解析SQL语句与执⾏计划⽣生成
处理引擎会将SQL语句解析成语法树的结构,这样就可以理解语句中的字段,表,条件等信息。
接着,需要确定如何执行SQL语句并返回结果数据。众所周知,SQL是一个声明式的语言,用户在语句中只说明了想要的结果,并没有告诉引擎用什么样的过程去获得数据。这对于用户来说编程起来更容易,但是对于DBMS来说,增加了复杂性,执行计划需要引擎自己来确定。完成这部分工作的代码被称作优化器。
对于一个固定的查询,往往有很多种执行方式,优化器的任务就是在其中选择最优解即代价最小的一种。
这就好像是围棋AI 阿尔法狗,要从围棋可能的无数种落子中选择胜率最高的一样。
优化器会使用一个代价计算函数,来估算每种执行方式的时间代价,最终从若干中执行方式中,选择他认为代价最小的一种。
注意,这个代价是估算的,并不一定非常的准确,依赖的标准是数据表的一些统计信息,如果统计信息不够准确,或者优化器的估算方法并没有很好,也会造成MySQL的执行计划不是最优化的。
我们在实践中也确实会遇到这样的情况,通常会使用两种方法来解决
- 使用hint来提示mysql用更好的执行计划
- 简化语句,让MySQL更容易的估算代价。
以上是MySQL执行引擎的介绍和解析,希望对大家的日常工作,能有更好的帮助。