ORって遅いのね
ひさしぶりに、とあるシステムのパフォーマンスをチューニングしてみた。
Ludiaで全文検索インデックスを使ってみたり、ORM任せにしないで自前でSQLを書いたりで、だいぶさくさく動くようになったっぽい。
知らなかったことがあったのでメモ。ORって遅いのね。
同じ結果を返すようにUNIONで組んだSQLと比べると、36倍程度の差があった。
以下で使用しているテーブルの行数はだいたい
products ... 9万件
product_specs ... 50万件
-- 2.16秒/70件 SELECT DISTINCT a.* FROM products a inner join product_specs b on b.product_id = a.id WHERE a.title @@ 'テスト' OR b.value @@ 'テスト' ORDER BY date desc
-- 0.06秒/70件 SELECT a.* FROM products a WHERE a.title @@ 'テスト' UNION SELECT a.* FROM products a inner join product_specs b on b.product_id = a.id WHERE b.value @@ 'テスト' ORDER BY date desc
ちなみにORもUNIONも使わずに、片方の条件で検索をかけると0.03秒。ORは本当に遅すぎ。
こんなに違うと、さすがに体感にもだいぶ差が出た。