1

我正在努力优化 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 列,beginvisibleFromvisibleTo也可以为空的整数。

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

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

4

1 回答 1

1

我认为WHERE中范围限制的重要索引是visibleFrom和visibleTo两列的索引,即

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

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

于 2013-03-30T10:21:36.137 回答