はOR演算は、おそらくあなたの速度を台無しにしようとしていますほとんどの場合、ORはインデックスのパフォーマンスを低下させます。 これは、最も簡潔に変換は同等に参加:
SELECT t1.id
FROM t1 INNER JOIN t2 ON t2.id IN (t1.id2, t1.id3, t1.id4)
WHERE t1.date1 >= (UTC_TIMESTAMP() + INTERVAL - 20 Hour)
OR t1.date2 >= (UTC_TIMESTAMP() + INTERVAL - 20 Hour)
;
INは論理的ORですが、私はより多くの最近のMySQLのバージョンではそれを少し最適化されていると思います。ない場合は、このはより良いパフォーマンスかもしれません:
SELECT t1.id
FROM t1
LEFT JOIN t2 AS t2_2 ON t2_2.id = t1.id2
LEFT JOIN t2 AS t2_3 ON t2_3.id = t1.id3
LEFT JOIN t2 AS t2_4 ON t2_4.id = t1.id4
WHERE (t1.date1 >= (UTC_TIMESTAMP() + INTERVAL - 20 Hour)
OR t1.date2 >= (UTC_TIMESTAMP() + INTERVAL - 20 Hour)
)
AND (t2_2.id IS NOT NULL OR t2_3.id IS NOT NULL OR t2_4.id IS NOT NULL)
;
をこれは、IDフィールドにORのを避けるため、これらのフィールドにインデックスを利用することができます。ジョインは3倍になるので、やはり遅くなる可能性があります。
参加する必要がありますか、単により洗練されたクエリを作成する方法を探していますか? – Mureinik
@Mureinikはい、私の元の意図です。しかし、私は本当にそれがエレガントであるかどうかに関係なく、より速く "より良い"という意味を持っています。 – tatskie