このクエリを最適化するにはどうすればよいですか?
質問
このクエリを最適化するにはどうすればよいですか?これを行うにはもっと簡単な方法があるはずです。目標は、削除ステートメントに簡単に変換できることです。
SELECT * FROM team
WHERE team_id IN (
SELECT team_id
FROM (
SELECT team.team_id, (
SELECT COUNT(*)
FROM signup
WHERE signup.team_id = team.team_id
) AS members
FROM team, schedule, event
WHERE team.schedule_id = schedule.schedule_id
AND schedule.event_id = event.event_id
AND event.event_id =183) AS t
WHERE members = 0
)
解決
このクエリを一目で見ると、次のことがわかります。
select
t.*
from
team t
inner join schedule s on t.schedule_id = s.schedule_id
inner join event e on s.event_id = e.event_id
left outer join signup sp on t.team_id = sp.team_id
where
e.event_id = 183
and sp.team_id is null
イベントに参加しているがサインアップテーブルに参加していないチームをすべて探しているようです。これは正確ですか?
また、特にサブクエリが各行に依存している場合(場合によっては)、サブクエリの束よりも結合を行う方が高速になることに注意したいです。
乾杯、
エリック
他のヒント
このスレッドでのEricのクエリにコメントして、代わりに存在チェックを使用することを(mssqlserverの背景から)お勧めします。そうすることで(1)意図がより明確になり、(2)オプティマイザーは最初の一致が見つかった後に一致するteam_idの検査を停止する機会を与えます(> = 1一致する行により存在チェックがfalseになるため)。 例:
選択 t。* から チームt t.schedule_id = s.schedule_idの内部結合スケジュール s.event_idの内部結合イベントe = e.event_id どこで e.event_id = 183 存在しない(team_id = t.team_idのサインアップから*を選択)
ただし、mysql固有のパフォーマンスの問題がある可能性があります。
所属していません StackOverflow