ごらくらいふ

プログラミングしたりゲームしたり

Select文でJoinするときは一番深いところをFromにしたい

前提

  • mysqlでの話。
  • Subjects --(1:n)-+ Subjects_Tags +-(n:1)-- Tags というテーブル構造での話。

本題

趣味の範疇なのだろうけれども、レコード数が増加する方向のJOINは極力控えたい。 Select * from Subjects left join Subjects_Tags ...より、Select * from Subjects_Tags left join Subjectsの方が好み。

「行を増やすこと自体にコスト多少コストがかかる」感覚を持っている。 オプティマイザがよしなにやってくれるはずなんだろうけどね。

具体的には

SELECT S.name, T.name AS tag_name
FROM Subjects AS S
  LEFT JOIN Subjects_Tags AS S_T ON S.id = S_T.subject_id
  LEFT JOIN Tags AS T ON S_T.tag_id = Tags.id
WHERE S_T.subject_id = :id
;

よりも

SELECT S.name, T.name AS tag_name
FROM Subjects_Tags AS S_T
  LEFT JOIN Subjects AS S ON S_T.subject_id = S.id
  LEFT JOIN Tags ON S_T.tag_id = Tags.id
WHERE S_T.subject_id = :id
;

の方が好み。