查询表达式:
FROM Table1 ... WHERE unique_not_null_column=5 也会返回常数表(constant tables)。
这个规则指一个常数表(constant tables)至多有一条记录值。MySQL就会优先评估是否为常数表(constant tables),并找出那个值。这样,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评估这语句时,首先就会发现,按照常数表(constant tables)的第二点定义,查询条件为unique_not_null_column的表Table1是一个常数表(constant tables),它就会取得这个值。
如果取值失败,也就是在表Table1里unique_not_null_column = 没值,EXPLAIN后结果:
Impossible WHERE noticed after reading const tables 相反,如果取值成功,也就是在表Table1里unique_not_null_column = 为一条记录值,MySQL会转化为如下语句:
SELECT 5, Table2.any_column FROM Table1, Table2 WHERE 5 = Table2.any_column AND 5 = 5;
事实上,这是一个很好的例子。优化器因前面提到的常数等值传递进行一些语句转化。另外,为什么要先描述常数等值传递,因为它在MySQL确认什么是常数表(constant tables)前就先进行了。优化器步骤的顺序,有时是有差别。
虽然很多查询都没常数表(constant tables)参考。应该牢记,以后无论什么时候,常数constant字被提及,它是指任何一个字面上的值或者一个常数表(constant tables)的内容。
2.优化JOIN联接
这部分讨论优化JOIN联接的不同方法。注意:JOIN联接不单单指JOIN类型,而是所有条件查询的类型。有些人更喜欢叫access type。
确定JOIN联接类型
当评估查询条件表达式时,MySQL会确定它是属于哪个JOIN联接类型。
如下有记录在档的JOIN类型,从最好到最坏的排序下来:
system:常数表(constant tables)的system类型 const:常数表(constant tables) eq_ref:相等关系的唯一或主键索引 ref:相等关系的索引,此索引的值不能为NULL ref_or_null:相等关系的索引,此索引的值可能为NULL range:有关联的索引,如BETWEEN,IN,>=,LIKE等 index:顺序扫描索引 AL |