select時のそういった最適化は全てオプティマイザーが最適解を求めてくれているのかと思い込んでいたがどうやらそういうわけでもない模様。
下記に示す二つのDQLで大きくパフォーマンスが違う。
■パターン1
select
p
from
HogeFugaBundle:Post as p
where
p.body like :str
and
p.deletedAt is null
and
p.createdAt >= :date
■パターン2
select
p
from
HogeFugaBundle:Post as p
where
p.createdAt >= :date
and
p.deletedAt is null
and
p.body like :str
だいたいレコード25万くらいのテーブルで実験したところ、パターン1が30秒前後、パターン2が2~3秒といった結果になった。
ある意味素直に最初に指定した条件から順番に絞り込むってことだね。そりゃ25万件のlikeは重いわ。
っていうお話。