2013-03-30 67 views
1

我正在努力优化MySQL查询。MySQL查询优化左连接索引存在

select * 
from course as t1 
left join semester as t3 on t1.semester=t3.id 
where t1.visibleFrom <= '1364621522' 
and '1364621522' <= t1.visibleTo 
order by t3.begin desc, t1.name; 

这是通过EXPLAIN报道在球场上的表使用ALL-查询。该表有几个不同的索引(visibleFrom,visibleTo,两者的组合,名称,学期)。 name是一个varchar列,begin,visibleFromvisibleTo是也可以为空的整数。

如果我忽略与t3的连接并强制使用索引名称,它会以某种方式工作。

任何想法为什么这个查询不使用索引?

回答

1

我认为在WHERE范围限制的重要指标是在两列visibleFrom和visibleTo指数,即

ALTER TABLE `course` ADD INDEX (`visibleFrom` , `visibleTo`); 

如果MySQL不会在查询中使用它,我的猜测是课程表有少于100行。因此,由于开销,MySQL查询优化器决定不使用索引。只要课程表包含几百行,就应该使用索引。