TIL

9.3(4) 세미 조인 최적화

세미 조인

SELECT *
FROM employees e
WHERE e.emp_no IN
	(SELECT de.emp_no FROM dept_emp de WHERE de.from_date='1995-01-01');

테이블 풀-아웃(Table Pull-out)

퍼스트 매치(firstmatch)

EXPLAIN SELECT *
FROM employees e WHERE e.first_name='Matt'
	AND e.emp_no IN (
		SELECT t.emp_no FROM titles t
		WHERE t.from_date BETWEEN '1995-01-01' AND '1995-01-30'
	);
id table type key rows Extra
1 e ref ix_firstname 233 NULL
1 t ref PRIAMRY 1 Using where; Using index; FirstMatch(e)

루스 스캔(loosescan)

루스 스캔 예제

EXPLAIN 
SELECT * FROM departments d WHERE d.dept_no 
IN (SELECT de.dept_no FROM dept_emp de);

구체화(Materialization)

EXPLAIN SELECT *
FROM employees e
WHERE e.emp_no IN
	(SELECT de.emp_no FROM dept_emp de
		WHERE de.from_date='1995-01-01');
id select_type table type key ref
1 SIMPLE ALL NULL NULL
1 SIMPLE e eq_ref PRIMARY .emp_no
2 MATERIALIZED de ref ix_fromdate const

중복 제거(Duplicated Weed-out)

EXPLAIN SELECT * FROM employees e
WHERE e.emp_no IN 
	(SELECT s.emp_no FROM salaries s WHERE s.salary>150000);
id select_type table type key Extra
1 SIMPLE s range ix_salary Using where; Using index; Start temporary
1 SIMPLE e eq_ref PRIMARY End temporary

참고로 위 에제는 Materialization, FirstMatch, LooseScan 최적화를 사용하지 못하게 한 상태에서 테스트했다.