【MySQL】Select执行过程

15 阅读2分钟

Select执行过程

两层架构:

  • Server 层:建立连接、分析和执行 SQL。

    • 包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。
    • 内置函数、跨存储引擎的功能实现。
  • 存储引擎层:数据的存储和提取。

    • 支持 InnoDB、MyISAM、Memory 等多个存储引擎。

  1. 连接器:用户连接

    1. # -h 指定 MySQL 服务得 IP 地址,如果是连接本地的 MySQL服务,可以不用这个参数;
      # -u 指定用户名,管理员角色名为 root;
      # -p 指定密码,如果命令行中不填写密码(为了密码安全,建议不要在命令行写密码),就需要在交互对话里面输入密码
      mysql -h$ip -u$user -p
      
    2. TCP三次握手建立连接
    3. 验证用户名、密码
    4. 获取该用户的权限,保存起来。只有重新连接才能加载新的权限。
    5. -- 查询连接列表
      show processlist;
      -- 查看连接最大空闲时长,默认值是 8 小时
      show variables like 'wait_timeout';
      -- 连接数量限制,默认151
      show variables like 'max_connections';
      -- 设置max_connections
      SET GLOBAL max_connections=1000;
      -- 单次最大数据报文
      SHOW VARIABLES LIKE 'max_allowed_packet';
      -- 设置max_allowed_packet
      SET GLOBAL max_allowed_packet=8388608;
      
      -- 手动断开连接
      kill connection + id
      
  2. 查询缓存

    1. SQL 是查询语句时先查询缓存,MySQL 8.0 版本废弃。

    2. Query Cache:

      • key:SQL语句
      • value:执行结果
    3. 缓存过期:只要一个表有更新操作,那么这个表的查询缓存就会被清空。

  3. 解析SQL:解析器

    1. 词法分析:识别关键字,构建出 SQL 语法树,方便模块获取 SQL 类型、表名、字段名、 where 条件等等。

    2. 语法分析:根据语法规则,判断否满足 MySQL 语法。

      • 只负责构建语法树和检查语法,但是不会去查表或者字段存不存在。
  4. 执行SQL

    1. Prepare 预处理阶段

      • 检查 SQL 查询语句中的表或者字段是否存在;
      • select * 中的 * 符号,扩展为表上的所有列;
    2. Optimize 优化阶段:制定一个执行计划

      • 某个值出现在表的数据行中的百分比(30%)很高,会忽略索引,进行全表扫描。
      • 查看查询执行计划:explain + SQL
    3. Execute 执行阶段:存储引擎交互

      • 主键索引查询
      • 全表扫描:存储引擎while循环查找,每查到一个就向执行器返回一条。
      • 索引下推:选择条件字段在联合索引字段有就不去回表查询