1. 连接器

  • 接收客户端的连接,并进行权限认证等

    2. 查询缓存

  • MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELECT语句和该查询语句的结果集做了一个HASH映射并保存在一定的内存区域中。
  • 作用:为了提升查询性能,但是实际情况有点差强人意。8.0已被废弃
  • 处理流程
    1. 服务器接收SQL,以SQL和一些其他条件为key查找缓存表(额外性能消耗)
    2. 如果找到了缓存,则直接返回缓存(性能提升)
    3. 如果没有找到缓存,则执行SQL查询,包括原来的SQL解析,优化等.
    4. 执行完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语句是否满足mysql语法。如果语句不对就会收到“You have an error in your SQL syntax”的错误提醒

      4. 优化器

  • 对分析后的SQL语句进行优化,根据某种规则确定执行的顺序,以便于后续的执行

  • 类型
    • 基于规则的优化 RBO
    • 基于成本的优化 CBO,MySQL使用这种
  • 作用

    • 索引的选择
    • 关联表的顺序

      5. 执行器

  • 执行SQL语句,与存储引擎挂钩

    6. 存储引擎

  • InnoDB

    • 默认的存储引擎,支持事务,行锁/表锁
  • MyISAM
    • 不支持事务,表锁
  • MEMORY
    • 基于Hash数据结构,存储在内存中,对临时表很有用,数据无法持久化
  • MRG_MYISAM
  • FEDERATED
  • PERFORMANCE_SCHEMA
    • 用于Performance Schema数据库
  • BLACKHOLE
    • 写入的所有数据都会消失,不知道干啥使的
  • CSV
  • ARCHIVE