当我们通过解析器理解了SQL语句要干什么之后,接着会找查询优化器(Optimizer)来选择一个最优的查询路径。
可能有同学这里就不太理解什么是最优的查询路径了,这个看起来确实很抽象,当然,这个查询优化器的工作原理,后续将会是我们分析的重点,大家现在不用去纠结他的原理。
但是我们可以用一个极为通俗简单的例子,让大家理解一下所谓的最优查询路径是什么。
就用我们刚才讲的那个例子好了,我们现在理解了一个SQL想要干这么一个事儿:我们现在要从“users”表里查询数据,查询“id”字段的值等于1的那行数据,对查出来的那行数据要提取里面的“id,name,age”三个字段。
事是明白了,但是到底应该怎么来实现呢?
你看,要完成这个事儿我们有以下几个查询路径(纯属用于大家理解的例子,不代表真实的MySQL原理,但是通过这个例子,大家肯定能理解所谓最优查询路径的意思):
直接定位到“users”表中的“id”字段等于1的一行数据,然后查出来那行数据的“id,name,age”三个字段的值就可以了先把“users”表中的每一行数据的“id,name,age”三个字段的值都查出来,然后从这批数据里过滤出来“id”字段等于1的那行数据的“id,name,age”三个字段
上面这就是一个最简单的SQL语句的两种实现路径,其实我们会发现,要完成这个SQL语句的目标,两个路径都可以做到,但是哪一种更好呢?显然感觉上是第一种查询路径更好一些。
所以查询优化器大概就是干这个的,他会针对你编写的几十行、几百行甚至上千行的复杂SQL语句生成查询路径树,然后从里面选择一条最优的查询路径出来。
相当于他会告诉你,你应该按照一个什么样的步骤和顺序,去执行哪些操作,然后一步一步的把SQL语句就给完成了。
我们来一起看看下面的图: