MySQL可以分为server层和存储引擎层两部分。
    server层包括连接器,查询缓存,分析器,优化器,执行器等。还包括一些内置函数。存储过程,视图等也是在server层实现的。
    存储引擎层负责数据存储和提取,是插件式的,可以使用不同的引擎,常见的有innodb,myIsam, memory。MySQL从5.5.5开始把innodb设置为了默认存储引擎。

    下面来看server层的流程。
    一条SQL语句的执行流程是:连接器—>查询缓存—>分析器—>优化器—>执行器—>
    连接器是负责和客户端建立连接的,包括检验用户名密码,权限判断等。连接分为长连接和短连接,连接的建立是复杂且消耗资源的,建议使用长连接。但是如果都使用长连接,在查询过程中使用到的临时内存也是在连接对象里面的,会使得MySQL占用内存原来越多,可能导致OOM。所以一般在长连接使用一段时间后就断开重连,或者在MySQL5.7之后的版本中,可以使用mysql_reset_connection 来重新初始化连接。
    查询缓存,连接建立完成后,先拿SQL语句去查询缓存中查询,如果命中缓存,则直接返回。如果没有命中,则继续往下走。查询完之后会把查询的结果以key-value的形式保存在查询缓存中,key是SQL语句,value是查询的结果集。但是一旦一个表更新了,那涉及到这个表的缓存就都会被清空,所以缓存其实是弊大于利的,好不容易缓存起来的数据,一个更新语句就清空了。对于更新多的表来说是很不划算的,所以建议在配置中禁用缓存。
    当需要对某个SQL进行缓存的时候,可以在SQL语句加上 select SQL_CACHE from XX 只对这条查询进行缓存。MySQL8开始就去掉了查询缓存模块。
    分析器,对输入的SQL语句进行分析,包括语法分析和词法分析,语法分析判断是否符合SQL语法,词法分析是分析出哪个是表,哪个是字段。
    优化器,对分析后的SQL进行优化,例如有多个索引应该使用哪个;join查询先查询哪个表等等。
    *执行器
    ,最后就是执行器,执行器调用存储引擎的接口,获取查询数据。