본문 바로가기

프로그래밍/MySQL

[MySQL] Where In & SubQuery 는 최악! JOIN & MAX & GROUP BY 사용

반응형

최근에 구축 중인 사이트가 있는데, 방대한 양의 시세 정보 데이터를 적재하고 이를 검색서비스를 제공하는 사이트이다. 

여러 다른서버들이 있어 다른서버의 시세도 한눈에 보게끔 해주고 싶었는데, 아무 생각 없이 where 에 in 으로 서브 쿼리를 넣어 주는걸로 작성을 해주었더니, 시간이 매우 오래 걸렸다.

 

SELECT * FROM auction
	WHERE idx IN (
    	SELECT MAX(idx) FROM auction
        	WHERE item_id = :item_id
            GROUP BY realm_id, auction_house_id, item_id)
    ORDER BY price_min DESC;

위 쿼리의 결과가 도출되는데 4초에서 6초가 소요되었다. 개선을 해볼수 있지 않을까 싶어 여러 검색을 해보았는데, where 에서는 서브 쿼리를 절대 쓰지 말라, join 을 사용하라는 글이 많이 있어 join 으로 변경 해보았다.

 

SELECT main.* FROM auction AS main
	JOIN (
    	SELECT MAX(idx) AS max_idx
        FROM auction WHERE item_id = :item_id
        GROUP BY realm_id, auction_house_id, item_id) AS sub
    ON main.idx = sub.max_idx
    ORDER BY price_min DESC

이렇게 변경 하니 채 1초도 걸리지 않았다. 10~30ms가 소요되었다... 

서브쿼리가 참 최악인가보다.

반응형