반응형
최근에 구축 중인 사이트가 있는데, 방대한 양의 시세 정보 데이터를 적재하고 이를 검색서비스를 제공하는 사이트이다.
여러 다른서버들이 있어 다른서버의 시세도 한눈에 보게끔 해주고 싶었는데, 아무 생각 없이 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가 소요되었다...
서브쿼리가 참 최악인가보다.
반응형
'프로그래밍 > MySQL' 카테고리의 다른 글
워드프레스 설치시, "데이터베이스 연결 중 오류" 발생. (0) | 2023.07.28 |
---|---|
실수로 용량이 큰 테이블에 OPTIMIZE TABLE을 실행 했을 때 (0) | 2022.11.23 |
MySQL 기본적인 모니터링 방법과 Connection과 Memory 튜닝 방법 (0) | 2016.06.29 |
Running a syntax check on /etc/my.cnf (0) | 2016.06.29 |
mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead [duplicate] (0) | 2016.05.11 |