MySql系列(一):sql语句在MySQL中的执行过程

Mysql架构图


组件介绍

  • 连接器:负责通过TCP/IP协议连接客户端和MySQL服务器
  • 解析器:根据SQL语句语法生成解析树
  • 预处理器:判断解析器生成的解析树是否合法
  • 查询优化器:将合法的解析树转化为执行计划,并找到最优的执行计划
  • 执行引擎:调用存储引擎API执行SQL指令


过程分析

  • 客户端通过TCP/IP协议与MySQL服务器进行连接
  • 客户端发送SQL语句
  • MySQL服务器校验用户权限
  • 权限通过后,MySQL检查该条SQL语句是否命中缓存
  • 如果命中缓存后校验编写该条SQL语句的用户有无操作目标数据的权限,如果有直接返回结果
  • 如果没有命中缓存进入解析器,校验并解析SQL语句,生成解析树,如果SQL语句有问题会在此处报错
  • 预处理器判断该解析树是否合法,不合法会重构解析树生成新的解析树
  • 解析树会被查询优化器转化为多条执行计划,并从中找到最优的执行计划
  • 查询执行引擎接受到这个最优执行计划后会去调用存储引擎的API接口操作数据
  • 最后将数据返回给客户端并缓存到结果




重点分析

1.MySQL的缓存机制:

MySQL的缓存一旦开启,执行完SQL操作,会将SQL语句和执行结果哈希运算后得到KV对后,作为一张缓存hash表保存在服务器的内存中,并加全局锁来管理。

缺点:更新事务会导致缓存失效(针对innodb

在查询完数据表后,相关SQL和SQL结果会写入缓存,但是一旦该数据表的数据发生更新事务,在更新事务提交之前,与该表相关的缓存数据会进入缓存失效状态,如果此时另外的线程过来查询该表,是无法被缓存的,并且缓存数据在更新事务提交后会被清空,而且全局锁需要重新锁定该缓存表。另外,在缓存失效的情况下,如果有大量请求到达,会导致MySQL缓存雪崩。

优点:速度

命中缓存会大幅提高查询速度


适用条件:

对于需要频繁更新的表,不建议使用QC,对于数据不经常变动而且有大量相同SQL查询的表,开启QC会提高效率。



面试题:如何设计一个关系型数据库,设计一个关系型数据库要考虑什么

解析:

  1. 物理存储:文件持久化到存储设备中
  2. 程序映射:
  • 2.1:存储管理模块:将数据逻辑关系转化为数据物理关系,负责数据的加载
  • 2.2:缓存机制模块:负责记录IO以及编译过的SQL语句
  • 2.3:SQL解析模块:负责将SQL语句解析
  • 2.4:日志管理模块:负责记录用户的操作
  • 2.5:权限划分模块:负责管理多用户的权限
  • 2.6:容灾处理模块:负责灾难恢复
  • 2.7:索引管理模块:负责建立索引提高数据查询效率
  • 2.8:锁管理模块:复制管理数据的锁使得数据库支持高并发操作

答案:

首先划分为两大部分,存储部分和程序部分,存储部分相当于是文件系统,将数据持久化到存储设备中.程序部分是对存储进行逻辑上的管理.程序实例有,数据逻辑关系转化为数据物理关系的存储管理模块,优化数据库执行效率的缓存机制模块,解析SQL语句的SQL解析模块,记录用户操作的日志管理模块,进行多用户管理的权限划分模块,用于灾难恢复的灾难机制模块,提高数据查询效率的索引模块,使数据库支持并发操作的锁管理模块

面试题:MySQL提示“不存在此列”是执行到哪一个节点报出的

答案: 解析器阶段,在该阶段会解析SQL语句,SQL语句有问题会报错。








全部评论

相关推荐

刘湘_passion:太强了牛肉哥有被激励到
点赞 评论 收藏
分享
葬爱~冷少:我当时都是上午刷力扣,下午背八股,有活给我先别急,没活就干自己的事情
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务