我正在努力优化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
,visibleFrom
和visibleTo
是也可以为null的整数。
如果我遗漏了t3
的联接并强制使用索引名称,它会以某种方式工作。
为什么此查询不使用索引的任何想法?
答案 0 :(得分:1)
我认为WHERE中范围限制的重要指标是两列visibleFrom和visibleTo的索引,即
ALTER TABLE `course` ADD INDEX ( `visibleFrom` , `visibleTo` );
如果MySQL在您的查询中没有使用它,我的猜测是课程表少于~100行。因此,MySQL查询优化器决定不使用索引,因为开销。一旦课程表包含数百行,就应该使用索引。