개요
- WHERE IN 보다는 JOIN 문의 성능이 더 좋다
- WHERE IN 절은 실행 계획에서 OR절로 변환되어 N번의 동등(=) 비교를 수행하기 때문에 성능이 나쁘다
- MySQL 5.6버전부터는 실행 계획에서 IN절을 JOIN으로 변환하여 성능을 개선하였다
- 서브쿼리 존재 유무만 판별할 때는 IN대신 EXISTS 문을 사용하여 성능을 개선할 수 있다
- 서브쿼리를 반복해서 실행하는 단점이 있다
- 그러나 서브쿼리 WHERE 조건에 인덱스가 걸려 있다면 IN보다 빠를 것으로 예상된다
- IN: 동등 비교를 서브쿼리 결과 수만큼 수행, 반복 vs EXISTS: 인덱스 타고 가서 데이터 존재 여부 판별을 반복
- 서브쿼리 결과 row 수가 많다면 EXISTS가 유리, 적다면 IN이 유리할 것으로 예상된다
- 서브쿼리 결과 row 수가 증가하면 EXISTS의 hit rate는 증가하는 반면, IN에서는 비교해야 하는 row 수가 증가하기 때문이다
- 인덱스의 시간 복잡도 O(logN)과 서브쿼리 결과로 나오는 row 수를 비교해야 할 것 같다.
- 유저의 사용 패턴에 따라 결과가 달라질 것 같으니 실제 데이터를 기반으로 튜닝하는 것이 좋겠다.
- EXPLAIN으로 실행 계획을 확인하고, 수행 시간을 측정해서 DB 요건에 따라 어떤 구문이 가장 효율적일 지 판단하자.
참고 자료
https://jojoldu.tistory.com/520
MySQL where in (서브쿼리) vs 조인 조회 성능 비교 (5.5 vs 5.6)
MySQL 5.5에서 5.6으로 업데이트가 되면서 서브쿼리(Subquery) 성능 개선이 많이 이루어졌습니다. 이번 시간에는 MySQL 2개의 버전 (5.5, 5.6) 에서 서브쿼리를 통한 조회 (Select)와 Join에서의 조회간의 성능
jojoldu.tistory.com
[MYSQL] 📚 서브쿼리 연산자 EXISTS 총정리 (성능 비교)
EXISTS 연산자 서브쿼리가 반화나는 결과값이 있는지를 조사한다. 단지 반환된 행이 있는지 없는지만 보고 값이 있으면 참 없으면 거짓을 반환한다. 한 테이블이 다른 테이블과 외래키(FK)와 같은
inpa.tistory.com
https://peterica.tistory.com/414
[MySQL 튜닝] IN vs INNER JOIN vs EXISTS 성능비교
ㅁ 들어가며 [MySQL 튜닝] EXISTS를 이용한 SQL 튜닝에서 EXISTS를 통한 튜닝작업을 알아보았습니다. 하지만 EXISTS가 항상 성능을 향상시키는 것은 아닙니다. EXISTS와 동일한 작업을 수행할 수 있는 IN, IN
peterica.tistory.com
https://peterica.tistory.com/392
[MySQL 튜닝] EXISTS를 이용한 SQL 튜닝
ㅁ 개요 쿼리를 튜닝할 때에 가장 큰 요소는 색인데이터를 최소화 하는 방법이 있습니다. 이번 글에서는 EXISTS 구문을 통해서 불필요한 IO를 줄여 쿼리를 튜닝하는 방법을 정리해 보았습니다. ㅁ
peterica.tistory.com
https://www.geeksforgeeks.org/in-vs-exists-in-sql/
IN vs EXISTS in SQL - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
'Computer Science' 카테고리의 다른 글
[Network][스크랩] HTTP Status Code 422 - Unprocessable Entity (0) | 2024.08.02 |
---|---|
[DB] FK Constraint를 실무에서는 사용하지 않는 이유 (0) | 2024.07.12 |
[Network][스크랩] Bearer Authentication 헤더 규칙이 정해진 배경 (0) | 2024.06.24 |
Reactive Programming (0) | 2024.04.16 |
[Network] HTTP response status code (0) | 2024.04.06 |