一文读懂一条 SQL 查询语句是如何执行的( 五 )


举个例子:
mysql> select * from t1 where id = 10; 假设我们使用默认的 InnoDB 引擎 , 则执行器的执行流程大概是这样的(注意 , 如果 id 不是索引则会进行全表扫描 , 一行一行的查找 , 如果是索引则会在索引组织表中查询 , 比较负责 。 这里以非索引举例):
1)调用 InnoDB 引擎接口获取这个表的第一行记录 , 判断 id 值是不是 10 , 如果是则将这行记录存在一个集合中;如果不是则进入下一行的判断 , 直到取到这个表的最后一行
2)执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果返回给客户端
文末放一张《高性能 MySQL - 第 3 版》中的图片 , 总结下一条查询语句的执行过程:
一文读懂一条 SQL 查询语句是如何执行的
本文插图
【一文读懂一条 SQL 查询语句是如何执行的】

  1. MySQL 客户端与服务器间建立连接 , 客户端发送一条查询给服务器;
  2. 服务器先检查查询缓存 , 如果命中了缓存 , 则立刻返回存储在缓存中的结果;否则进入下一阶段;
  3. 服务器端进行 SQL 解析、预处理 , 生成合法的解析树;
  4. 再由优化器生成对应的执行计划;
  5. MySQL 根据优化器生成的执行计划 , 调用相应的存储引擎的 API 来执行 , 并将执行结果返回给客户端 。