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

MySQL对简单的表达式支持转换。比如下面的语法:

WHERE -5 = column1

转换为:

WHERE column1 = -5

尽管如此,对于有数学运算存在的情况不会进行转换。比如下面的语法:

WHERE 5 = -column1

不会转换为:

WHERE column1 = -5

11 AND

带AND的查询的格式为:

WHERE column1='x' AND column2='y'

优化的步骤:

1) 如果两个列都没有索引,那么使用全表扫描。

2) 否则,如果其中一个列拥有更好的存取类型(比如,一个具有索引,另外一个没有索引;再或者,一个是唯一索引,另外一个是非唯一索引),那么使用该列作为驱动表达式。

3) 否则,如果两个列都分别拥有索引,并且两个条件对应的存取类型是一致的,那么选择定义索引时的先定义的索引。

举例如下:

CREATE TABLE Table1 (s1 INT,s2 INT);

CREATE INDEX Index1 ON Table1(s2);

CREATE INDEX Index2 ON Table1(s1);

SELECT * FROM Table1 WHERE s1=5 AND s2=5;

优化器选择s2=5作为驱动表达式,因为s2上的索引是新建的。

12 OR

带OR的查询格式为:

WHERE column1='x' OR column2='y'

优化器做出的选择是采用全表扫描。

当然,在一些特定的情况,可以使用索引合并,这里不做阐述。

如果两个条件里面设计的列是同一列,那么又是另外一种情况,考虑如下的查询语句:

WHERE column1='x' OR column1='y'

在这种情况下,该查询语句采用索引范围查找。

03-15 11:01