SQL执行过程

321 阅读3分钟

MySQL体系结构

  • Client Connectors

    • JDBC,ODBC,.NET,PHP,Python,PECL,C API
  • MySQL SERVER

    • Connection Pool 连接池

    • SQL Interface SQL接口

    • Parser Lexical 语法解析树

    • Optimizer 根据语法解析来进行优化

    • Caches 缓存

    • Services & utilities 备份集群

  • Pluggable Storage Engines

    • MyISAM

    • InnoDB

MySQL查询优化-查询执行的路径

1 客户端/服务端通信协议

查询缓存,如果有数据返回,否则继续

2 解析器根据解析树解析

预处理器检测正常继续,否则报错(比如要查询的字段不存在)

3 查询优化器

explain查询执行计划(好比以前我们调试接口才能发现问题所在,现在explain找到查询慢的原因,这是我们程序员最需要学习的地方)

4 查询执行引擎

根据上一步的查询优化指导,选择查询引擎进行查询

5 结果

如果开启了缓存,缓存结果后返回,否则直接返回	

MySQL查询优化-查询执行的路径详细讲解

1 mysql客户端/服务端通信

  • 半双工

    • 双向通信,但是无法同时发送接受

      • 客户端一旦开始发送消息,另一端要接受完整个消息后才能响应
      • 客户端一旦开始接收数据没法停下来发送指令
  • 对于一个mysql连接,或者说一个线程,时刻都有一个状态来标识这个连接正在做什么

    • 查看命令 show full processlist / show processlist

    • Sleep

      • 线程正在等待客户端发送数据
    • Query

      • 连接线程正在执行查询
    • Locked

      • 线程正在等待表锁的释放
    • Sorting result

      • 线程正在对结果进行排序
    • Sending data

      • 向请求端返回数据
    • 可通过kill{id}的方式进行连接的杀掉

2 查询缓存

  • 工作原理

    • 缓存SELECT操作的结果集和SQL语句
    • 新的SELECT语句,先去查询缓存,判断是否存在可用的记录集
  • 判断标准

    • 与缓存的SQL语句,是否完全一样
    • 简单认为存储一个key-value结构,key为sql,value为sql的查询结果集

3 查询优化处理

  • 解析sql

  • 预处理阶段

  • 查询优化器

    • 优化器的主要作用就是找到最优的执行计划
      • 使用等价变化规则
      • 优化count、min、max等函数
      • 覆盖索引扫描
      • 子查询优化
      • 提前终止优化
      • IN的优化
      • ......
    • MySQL的查询优化器是基于成本计算的原则,他会尝试各种执行计划,如要数据抽样进行试验(随机的读取一个4K的数据块进行分析)
    • or比in好
      • a=1 or a=2 or a=3 or a=4 or a=5
        • 一个个比对,时间复杂度为O(n)
      • a in (1,2,3,4,5)
        • 排序,进行二分法比对,时间复杂度为O(log2N)

4 调用执行引擎

5 返回客户端

todo

这节视频课程explain和慢查询日志配置讲的非常好,以后单独写一片博客