mysql结构与执行流程

mysql 详细结构
在这里插入图片描述
组成部分:

  1. 连接池组件
  2. 管理服务和工具组件
  3. Sql接口组件
  4. 查询分析器组件
  5. 优化器组件
  6. 缓冲组件
  7. 插件式存储引擎(与其他数据库的主要区别)
  8. 物理文件
    MySQL数据库区别与其他数据库最重要的一个特点就是期插件式的表存储引擎,mysql插件式的表存储引擎结构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必须的,例如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者可以按照自己的意愿来进行开发,需要特别注意的是,存储引擎是基于表的,而不是数据库

mysql SQL执行流程

在这里插入图片描述
MySQL 整个查询执行过程,总的来说分为 5 个步骤 :
1.客户端向 MySQL 服务器发送一条查询请求
2.服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果,否则进入下一阶段 (注:mysql8.0之前)
3.服务器进行 SQL解析、预处理、再由优化器生成对应的执行计划
4.MySQL 根据执行计划,调用存储引擎的 API来执行查询
5.将结果返回给客户端,同时缓存查询结果

之前只知道查询语句不要 select * 和 尽量使用 limit做数量限制, 但知其然不知所以然。 这是跟MySQL客户端/服务端通信协议有关。

MySQL客户端/服务端通信协议 是 “半双工” 的,在任一时刻,要么是服务器向客户端发送数据,要么是客户端向服务器发送数据,这两个动作不能同时发生。一旦一端开始发送消息,另一端要接收完整个消息才能响应它,所以无法也无须将一个消息切成小块独立发送,也没有办法进行流量控制。客户端用一个单独的数据包将查询请求发送给服务器,所以当查询语句很长的时候,需要设置 max_allowed_packet参数,如果查询实在是太大,服务端会拒绝接收更多数据并抛出异常。与之相反的是,服务器响应给用户的数据通常会很多,由多个数据包组成。但是当服务器响应客户端请求时,客户端必须完整的接收整个返回结果,而不能简单的只取前面几条结果,然后让服务器停止发送。因而在实际开发中,尽量保持查询简单且只返回必需的数据,减小通信间数据包的大小和数量是一个非常好的习惯,这也是查询中尽量避免使用 SELECT * 以及加上 LIMIT 限制的原因之一