MySQL大致分为Server层和引擎层两部分
Server层负责所有跨引擎的操作,引擎层负责数据的读取和存储。
一条查询SQL的流程
select * from t where ID = 1
连接器
连接器负责与客户建立连接,获取权限,维持和管理连接。
在客户经过TCP握手后,连接器会认证身份,认证通过后将会查询该用户的权限,这意味着如果改变了一个用户的权限则仅对新的连接生效,旧连接仍使用旧的权限。
此外,长连接对象中的内存只有在连接释放时内存才回释放,可能会导致mysql占用内存过多而OOM,所以需要定期清理长连接。或者在执行长事务后mysql_reset_connection(5.7后)重置连接。
分析器
首先词法分析根据SQL分析出表,列等信息,并了解这个SQL想做什么。在这里也会判断SQL索要查询的表以及列是否存在,这里不需要打开表,因为表结构信息已经存储在MySQL中了。
再进行语法分析判断SQL是否有语法错误。
优化器
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序
执行器
执行器首先会判断是否有对这个表操作的对应权限,如果有则会对相对应的引擎接口进行请求。如果没有索引,调用 InnoDB 引擎接口取表的第一行,判断 ID 值是不是 1,如果不是则跳过,如果是则将这行存在结果集中;调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
对于有索引,每次调用的接口是满足条件的一行。
所以,在慢查询的日志中rows_examined这个值代表的是调用接口的次数。但这不代表扫描的行数,因为引擎可能在调用一次接口时扫描了多行。