一条SQL查询语句是如何执行的?(12)

你会在数据库的慢查询日志中看到一个 rows_examined 的字段 , 表示这个语句执行过程中扫描了多少行 。 这个值就是在执行器每次调用引擎获取数据行的时候累加的 。

在有些场景下 , 执行器调用一次 , 在引擎内部则扫描了多行 , 因此引擎扫描行数跟 rows_examined 并不是完全相同的 。 我们后面会专门有一篇文章来讲存储引擎的内部机制 , 里面会有详细的说明 。

小结

今天我给你介绍了 MySQL 的逻辑架构 , 希望你对一个 SQL 语句完整执行流程的各个阶段有了一个初步的印象 。 由于篇幅的限制 , 我只是用一个查询的例子将各个环节过了一遍 。 如果你还对每个环节的展开细节存有疑问 , 也不用担心 , 后续在实战章节中我还会再提到它们 。

我给你留一个问题吧 , 如果表 T 中没有字段 k , 而你执行了这个语句 select * from T where k=1 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’” 。 你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?

推荐阅读