MySQL查询优化器  Mysql查询优化器的工作是为查询语句选择合适的执行路径。查询优化器的代码一般是经常变动的,这和存储引擎不太一样。因此,需要理解最新 版本的查询优化器是如何组织的,请参考相应的源代码。整体而言,优化器有很多相同性,对mysql一个版本的优化器做到整体掌握,理解起mysql新版本 以及其他数据库的优化器都是类似的。  5 常量计算

WHERE columb1 = 1 + 2

WHERE columb1 = 3

6 常量以及常量表

常量表的定义如下:

1) 一个表只有0行或者1行数据。

2) 在WHERE子句中包含条件column = constant,并且这些列是primary key,或者这些列是UNIQUE(假设该UNIQUE同时被定义为NOT NULL)。这样生成的查询结果也可以成为常量表。

如果表Table0定义中包含:

… PRIMARY KEY(column1,column2)

再看下面的语法:

FROM Table0 … WHERE column1=5 AND column2=7 …

那么该语句返回的就是常量表。

举个更简单的情况,建设Table1定义中包含:

… unique_not_null_column INT NOT NULL UNIQUE

再看下面的语法:

FROM Table1 ... WHERE unique_not_null_column=5

该语句返回的也是常量表。

从例子中我们可以看出常量表最多只有1个行值。MySQL会预先评估常量表,找出这个值,然后将这个值引入到查询语句中进行优化,举例如下:

SELECT Table1.unique_not_null_column, Table2.any_column

FROM Table1, Table2

WHERE Table1.unique_not_null_column = Table2.any_column

AND Table1.unique_not_null_column = 5;

在评估这个查询语句时,MySQL首先发现通过Table1.unique_not_null_column条件的限制,Table1会变成一个常量表。然后,取回该值。

如果取回操作失败(Table1中没有行满足条件unique_not_null_column = 5),那么该常量表就包含0行,那么如果对该语句执行EXPLAIN操作,会得到提示信息:

Impossible WHERE noticed after reading const tables

03-15 10:56