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会提高效率。
面试题:如何设计一个关系型数据库,设计一个关系型数据库要考虑什么
解析:
- 物理存储:文件持久化到存储设备中
- 程序映射:
- 2.1:存储管理模块:将数据逻辑关系转化为数据物理关系,负责数据的加载
- 2.2:缓存机制模块:负责记录IO以及编译过的SQL语句
- 2.3:SQL解析模块:负责将SQL语句解析
- 2.4:日志管理模块:负责记录用户的操作
- 2.5:权限划分模块:负责管理多用户的权限
- 2.6:容灾处理模块:负责灾难恢复
- 2.7:索引管理模块:负责建立索引提高数据查询效率
- 2.8:锁管理模块:复制管理数据的锁使得数据库支持高并发操作
答案:
首先划分为两大部分,存储部分和程序部分,存储部分相当于是文件系统,将数据持久化到存储设备中.程序部分是对存储进行逻辑上的管理.程序实例有,数据逻辑关系转化为数据物理关系的存储管理模块,优化数据库执行效率的缓存机制模块,解析SQL语句的SQL解析模块,记录用户操作的日志管理模块,进行多用户管理的权限划分模块,用于灾难恢复的灾难机制模块,提高数据查询效率的索引模块,使数据库支持并发操作的锁管理模块