by 음미 [SQL Query] using_temporary [2021.12.28 10:59:01]
SELECT DISTINCT와 JOIN을 하면 무조건 Tmp table이 생기나요? 아래와 같은 쿼리를 작성(실험및 질문을 위해 단순화 했습니다)했는데요. distinct를 하려는 컬럼이 primary key 인 Id임에도 불구하고 EXPLAIN을 해보면 music_audiofile에서 using temporary라고 뜹니다. 실제로 쿼리를 실행하고 SHOW STATUS LIKE "Created_tmp%"; 를 확인해보면 tmp TABLE이 만들어진 것을 확인할수도 있었습니다. DESCRIBE SELECT DISTINCT `music_track`.`id` FROM `music_track` INNER JOIN `music_audiofile` ON (`music_track`.`id` = `music_audiofile`.`track_id`) WHERE (`music_audiofile`.`flags` IN (820, 21, 111, 200));
JOIN을 하고 SELECT DISTINCT를 하면 무조건 tmp Table이 생긴다고 이해해야 할까요?? 혹시 개선할 방법이 없을까요?
무조건 tmp Table이 생긴다고 생각하는 근거가 있나요?
-- Exists -- SELECT id FROM music_track a WHERE EXISTS (SELECT 1 FROM music_audiofile b WHERE b.track_id = a.id AND b.flags IN (820, 21, 111, 200) ) ; -- IN -- SELECT id FROM music_track a WHERE id IN (SELECT track_id FROM music_audiofile b WHERE b.flags IN (820, 21, 111, 200) ) ;