一条查询语句是如何工作的?

mysql 的架构分为两层:Server 层和 存储引擎层

  • server 层: 负责建立连接和分析、执行sql
  • 引擎层:负责数据的提取和存储
  1. 连接器
    • 管理连接和权限验证
    • Mysql 会定期⾃动清理"空闲"连接,由参数 wait_timeout 控制的,默认值是 8 ⼩时。
    • 由于建⽴连接⽐较复杂,所以尽量使⽤⻓连接,⽽不是 短连接(少量查询后,就断开连接),但是,当 ⻓连接 过多时,可能导致内存占⽤太⼤,被系统强⾏杀掉(OOM),会导致 MySQL 异常重启
  2. 查询缓存
    • 执⾏查询语句前,先看下查询缓存中是否有结果
    • 不建议使⽤查询缓存(当 数据表频繁更新时,最新查询结果可能和查询缓存中存放的结果不⼀致)
    • MySQL 8.0 开始,执⾏⼀条 SQL 查询语句,不会再⾛到查询缓存这个阶段了。
  3. 解析sql
    • 词法分析:根据你输⼊的字符串识别出关键字出来
    • 语法分析:根据词法分析的结果判断是否符合SQL语法,并构建SQL语法课
  4. 执行sql
    • 预处理阶段:判断表和字段是否存在
    • 优化阶段:将 SQL 查询语句的执⾏⽅案确定下来,⽐如在表⾥⾯有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使⽤哪个索引, 或者在⼀个语句有多表关联(join)的时候,决定各个表的连接顺序。
    • 执⾏阶段:MySQL通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进⼊了执⾏器阶段,开始执 ⾏语句(执⾏语句时,⾸先会判断当前⽤户是否有执⾏权限)。