在Mysql中一条查询SQL的执行过程是怎样的

    在Mysql中执行过程总共分为五步。

第一步:查询缓存

    查询缓存这一步在mysql是默认关闭的,而且在mysql8.0之后就正式移除。
    移除的原因主要有两点。首先,mysql缓存的格式为key-valuekey为sql语句,value为查询到的结果。这样的缓存格式就导致sql的命中条件很苛刻。假如sql多了一个空格都会导致无法命中缓存。
    第二点就是由于表中的数据是动态变化的,数据一变缓存就要跟着更新,这样就导致缓存的更新成本过高。
    所以查询缓存这步多多少少都有点副作用,移除它只是合情合理。

第二步:解析字段

    根据空格,将sql拆分成一个个最小的单元。比如说sql:select name,wechat from fans where sex = '女' and yanzhi > 90,并参照数据库的语法字典将这些单元分类。此时若出现关键字的拼写错误,则会出现报错提升;如果拼写没有错误,则会将分类后的单元转换成一种树形结构。
在Mysql中一条查询SQL的执行过程是怎样的_第1张图片
    绿色代表关键字,红色代表变量名以及表名,灰色则表示需要进一步拆分。

第三步:预处理

    对树型结构中的表名、字段名进行校验,如果表名或字段名不存在,则会在这一步返回报错信息。

第四步:优化

    这里的优化是指对查询效率的优化。优化器会根据上一步的树形结构生成多种sql的排列组合,然后结合一些算法来选择查询效率最快的一种执行方案。比如是否有索引、字段多个索引字段如何搭、多表关联时以那个表位基准表等等。这个执行方案会生成一个执行计划,这个我们口语在select前面加explain来查看。但是这一步计算出的执行计划不一定是最优的,因为算法本身就存在一定的概率性,他只能保证大概率是最优的。

最后一步:执行

    执行器首先会做权限判断,如果操作的角色没有对表的查询权限,则会在这一步返回权限错误。
    权限无误后执行器会拿上一步的执行计划来调用存储引擎。由存储引擎对数据进行实际的查询操作,并返回最终的查询结果。
    
    
    前四步也相当于预处理,也就是业务逻辑判断,而最终对物理数据进行操作的也就是存储引擎了。mysql是以组件的形式引入存储引擎的。然后将查询到的数据返回给终端。

你可能感兴趣的:(MySQL,mysql,sql,数据库)