1.看一件事不要直接陷入细节,先鸟瞰全貌,从高维度理解问题
2.SQL语句在MYSQL中的执行过程

MySQL可分为server层和存储引擎层
Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等
存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎
连接器:
负责跟客户端建立连接、获取权限、维持和管理连接
认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限
数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。
连接的过程较为复杂,建议使用长连接,但是用长连接可能会导致MySQL内存内用高。
查询缓存:
之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中
不建议使用查询缓存,因为查询缓存失效非常频繁,对一个表有更新,该表上的查询缓存就会全部失效。
MySQL 8.0 版本直接将查询缓存的整块功能删掉了
分析器:
首先识别字符串分别是什么,代表什么,接着做语法分析,判断是否满足MySQL语法。
优化器:
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序
执行器:
开始执行的时候,要先判断一下你对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误(在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用 precheck 验证权限)
如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口
在数据库的慢查询日志中可以看到一个 rows_examined 的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的
在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟 rows_examined 并不是完全相同的