MySQL查询优化器  Mysql查询优化器的工作是为查询语句选择合适的执行路径。查询优化器的代码一般是经常变动的,这和存储引擎不太一样。因此,需要理解最新 版本的查询优化器是如何组织的,请参考相应的源代码。整体而言,优化器有很多相同性,对mysql一个版本的优化器做到整体掌握,理解起mysql新版本 以及其他数据库的优化器都是类似的。  另外一种情况是取回操作成功(Table1中严格只有一行满足条件unique_not_null_column = 5),那么常量表中包含一条数据,并且MySQL会将查询语句转化为:

SELECT 5, Table2.any_column

FROM Table1, Table2

WHERE 5 = Table2.any_column

AND 5 = 5;

实际上,这个例子是个复杂的例子,这里面也用到了上文所说的常量转化。

7 存取类型

当我们评估一个条件表达式,MySQL判断该表达式的存取类型。下面是一些存取类型,按照从最优到最差的顺序进行排列:

system … 系统表,并且是常量表

const … 常量表

eq_ref … unique/primary索引,并且使用的是'='进行存取

ref … 索引使用'='进行存取

ref_or_null … 索引使用'='进行存取,并且有可能为NULL

range … 索引使用BETWEEN、IN、>=、LIKE等进行存取

index … 索引全扫描

ALL … 表全扫描

优化器根据存取类型选择合适的驱动表达式。考虑如下的查询语句:

以下是引用片段:SELECT * FROM Table1 WHERE indexed_column = 5 AND unindexed_column = 6  因为indexed_column拥有更好的存取类型,所以更有可能使用该表达式做为驱动表达式。这里只考虑简单的情况,不考虑特殊的情况。

那么驱动表达式的意思是什么呢?考虑到这个查询语句有两种可能的执行方法:

1) 不好的执行路径:读取表的每一行(称为“全表扫描”),对于读取到的每一行,检查相应的值是否满足indexed_column以及unindexed_column对应的条件。

2) 好的执行路径:通过键值indexed_column=5查找B树,对于符合该条件的每一行,判断是否满足unindexed_column对应的条件。

一般情况下,索引查找比全表扫描需要更少的存取路径,尤其当表数据量很大,并且索引的类型是UNIQUE的时候。因此称它为好的执行路径,使用indexed_column列作为驱动表达式。

03-15 10:58