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は重いわ。
っていうお話。