从MySQL架构说起

从执行一条SQL语句开始

要执行SQL语句,首先要获取数据库连接。

连接器

连接器负责跟客户建立连接、获取权限、维持管理连接

  1. 建立连接需要认证,也就是校验用户名密码。
  2. 通过认证后连接器回到权限表里查出该用户拥有的权限,之后这个连接遇到的所有权限判断逻辑都依赖此时读到的权限(意味着建立连接后修改用户权限对已存在的连接无影响)
  3. 连接完成后如果没有后续动作,就会处于空闲状态。长时间空闲连接器会自动断开连接,这个时间就是 wait_timeout(默认8h)。连接断开后想要继续操作就需要重连,而建立连接往往复杂,所以还是建议使用长连接。但是长连接会使MySQL内存占用暴涨,是因为执行中临时占用的内存管理在连接对象里,只有断开连接才会释放资源,长连接积累下可能导致内存占用过大(OOM)MySQL异常重启。

长连接可能导致OOM可以考虑两种解决方案:

  1. 定期断开长连接
  2. MySQL5.7以后版本通过执行 mysql_reset_connection 初始化连接,不需要重连

查询缓存

连接建立后,就可以执行语句了,查询操作会优先查询缓存,执行过的语句及其结果集会以 key-value 形式存入内存,命中则直接返回结果集,没有再查询实际表数据。
但不建议使用查询缓存,主要原因如下:

  1. 缓存失效非常频繁,更新会清空该表上的所有缓存,因此更新频繁则缓存命中率很低。
  2. MySQL8.0删除了查询缓存,可见官方认为该项功能很鸡肋

分析器

开始执行语句前,MySQL需要知道你想做什么,就要解析语句,主要分为:

  1. 词法分析:识别这些字符串是什么、代表什么。识别出关键字“SELECT”代表查询,表名列名是什么。
  2. 语法分析:根据词法分析结果,语法分析器匹配语法规则,匹配失败则收到错误提示:“You have an error in your SQL syntax”
  3. 语义分析:生成解析树,校验表名列名是否存在(precheck)

优化器

MySQL知道你要做什么了,到优化器这里就会为你生成达成目的的执行方案。
多种执行方案逻辑结果相同,但执行效率不同,优化器筛选出最优的作为执行计划。

执行器

到这一步,MySQL知道你要做什么,还知道怎么做,于是进入执行器阶段执行语句。
开始执行时,要先判断一下你对这个表 T 有没有执行查询的权限(权限验证)。
验证通过则打开表,根据表的引擎去调用该引擎提供的接口。

例如一条查询SQL “select * from T where ID=10;”,执行过程如下:

  1. 列ID无索引可用,则需要全表扫描,执行器调用引擎接口每次获取一行数据,判断其ID是不是10,是则存入结果集,否则跳过。循环扫描完全表数据。
  2. 列ID有索引可用,执行器调用“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口

扫描行数可分为执行器扫描行数和存储引擎扫描行数
前者是执行器每次调用引擎获取行时累加的,即慢查询日志中 rows_examined 字段,表示语句执行过程扫描的行数。
后者是引擎内部查找满足条件行经过的行数。
可以看出有些场景下,执行器调用一次,引擎内部则扫描了多行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值