1. 连接器
- MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELECT语句和该查询语句的结果集做了一个HASH映射并保存在一定的内存区域中。
 - 作用:为了提升查询性能,但是实际情况有点差强人意。8.0已被废弃
 - 处理流程
- 服务器接收SQL,以SQL和一些其他条件为key查找缓存表(额外性能消耗)
 - 如果找到了缓存,则直接返回缓存(性能提升)
 - 如果没有找到缓存,则执行SQL查询,包括原来的SQL解析,优化等.
 - 执行完SQL查询结果以后,将SQL查询结果存入缓存表(额外性能消耗)
 
 - 命中条件
- 缓存存在一个hash表中,通过查询SQL,查询数据库,客户端协议等作为key.在判断是否命中前,MySQL不会解析SQL,而是直接使用SQL去查询缓存,SQL任何字符上的不同,如空格,注释,都会导致缓存不命中.
 - 如果查询中有不确定数据,例如CURRENT_DATE()和NOW()函数,那么查询完毕后则不会被缓存.所以,包含不确定数据的查询是肯定不会找到可用缓存的
 
 - 失效时机
- 在表的结构或数据发生改变时,查询缓存中的数据不再有效。有这些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE会导致缓存数据失效。所以查询缓存适合有大量相同查询的应用,不适合有大量数据更新的应用。
 - 当某个表正在写入数据,则这个表的缓存(命中检查,缓存写入等)将会处于失效状态.在Innodb中,如果某个事务修改了表,则这个表的缓存在事务提交前都会处于失效状态,在这个事务提交前,这个表的相关查询都无法被缓存.
 
 不同存储引擎的实现不同。比如MyISAM,缓存的结果集存储在OS Cache中,而最流行的InnoDB则放在Buffer Pool中。
3. 分析器
解析SQL语句,构建一个AST 抽象语法树,判断语句是否满足语法;MySQL通过关键字将SQL语句进行解析,并生成一颗对应的解析(抽象语法)树。这个过程解析器主要通过语法规则来验证和解析。比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等等。预处理则会根据MySQL规则进一步检查解析树是否合法。比如检查要查询的数据表和数据列是否存在等等。
- 词法分析
- 分析器会先做词法分析,输入的是由多个字符串和空格组成的一条SQL语句,mysql需要识别出里面的字符串分别是什么,代表什么。
 
 语法分析
对分析后的SQL语句进行优化,根据某种规则确定执行的顺序,以便于后续的执行
- 类型
- 基于规则的优化 RBO
 - 基于成本的优化 CBO,MySQL使用这种
 
 作用
- 
6. 存储引擎
 InnoDB
- 默认的存储引擎,支持事务,行锁/表锁
 
- MyISAM
- 不支持事务,表锁
 
 - MEMORY
- 基于Hash数据结构,存储在内存中,对临时表很有用,数据无法持久化
 
 - MRG_MYISAM
 - FEDERATED
 - PERFORMANCE_SCHEMA
- 用于Performance Schema数据库
 
 - BLACKHOLE
- 写入的所有数据都会消失,不知道干啥使的
 
 - CSV
 - ARCHIVE
 
