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 列であり、beginnullになることもある整数です。visibleFromvisibleTo

結合を省略しt3てインデックス名の使用を強制すると、何とか機能します。

このクエリがインデックスを使用しない理由はありますか?

4

1 に答える 1

1

WHERE の範囲制限の重要なインデックスは、visibleFrom と visibleTo の 2 つの列のインデックスだと思います。

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

MySQL がクエリでそれを使用しない場合、コース テーブルの行数は ~ 100 未満であると推測されます。したがって、MySQL クエリ オプティマイザーは、オーバーヘッドのためにインデックスを使用しないことを決定します。course テーブルに数百行が含まれるとすぐに、インデックスを使用する必要があります。

于 2013-03-30T10:21:36.137 に答える