【Mysql/Doctrine2】where句の記述順によるパフォーマンスの違い。

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は重いわ。

っていうお話。