반응형
IN
in은 입력된 값들 중 하나라도 일치하는 것이 있으면 조회된다.
쿼리가 실행될 때 내부적으로 or 연산자로 변경되어 실행되는 것이다.
select e.emp_no
from employees.employees e
where emp_no in (SELECT s.emp_no from employees.salaries s);
select e.*
from employees.employees e
where emp_no in (SELECT s.emp_no from employees.salaries s)
employees 데이터는 300,024개
salaries 데이터는 2,844,047개이다
시간 초가 계속 변하긴 하지만
select 값 하나를 조회할 때는 3-5ms
select 값을 전체 조회할 때는 4-5ms 가 걸린다
EXISTS
in 구문과 다르게 메인 쿼리를 가져오고 exists의 서브쿼리를 실행시켜 결과가 존재하는지 판단한다.
in은 비교할 값을 직접 대입할 수 있지만 exists연산자는 서브쿼리만 사용할 수 있다는 특징이 있다.
select e.emp_no
from employees.employees e
where EXISTS (SELECT s.emp_no from employees.salaries s)
select e.*
from employees.employees e
where EXISTS (SELECT s.emp_no from employees.salaries s)
시간 초가 계속 변하긴 하지만
select 값 하나를 조회할 때는 1-3ms
select 값을 전체 조회할 때는 3-4ms 가 걸린다
결론
IN 과 EXISTS의 차이는
EXISTS 는 row 가 존재하는지 체크하고 더이상 수행되지 않지만
IN은 실제 존재하는 데이터들의 모든 값들을 확인한다.
조회하는 데이터가 많지 않은 경우(몇백~몇천) - IN
조회하는 데이터가 많은 경우 - EXISTS
(빠른 속도가 필요한 경우 INNER JOIN )
IN은 EXISTS 에 비해 성능이 떨어진다고 하는데
쿼리 튜닝을 어떻게 하느냐에 따라서 성능이 다르기 때문에
무조건 IN이 EXISTS보다 성능이 나쁜것은 아니다.
728x90
'프로그래밍 언어 > DB' 카테고리의 다른 글
[MySQL/Intellij] Public key retrieval is not allowed 에러 해결 (0) | 2023.09.18 |
---|---|
[SQL] MySQL 5.7버전과 8.0버전 차이점, 8.0 업그레이드 (0) | 2023.09.14 |
[DB] MySQL 샘플 데이터 (0) | 2023.09.02 |
[SQL 튜닝] 옵티마이저(optimizer) (0) | 2023.08.27 |
[MySQL] InnoDB란 (0) | 2023.07.27 |