TIL

10.3(1) 실행 계획 분석(id, select_type)

10.3.1 id 칼럼

id select_type table key ref rows Extra
1 SIMPLE e ix_firstname NULL 3000252 Using index
1 SIMPLE s PRRIMARY employees.e.emp_no 10 NULL

10.3.2 select_type 칼럼

SIMPLE

PRIMARY

UNION

EXPLAIN SELECT * FROM (
	(SELECT emp_no FROM employees e1 LIMIT 10) UNION ALL
	(SELECT emp_no FROM employees e2 LIMIT 10) UNION ALL
	(SELECT emp_no FROM employees e3 LIMIT 10)
) tb;
id select_type table type key ref rows Extra
1 PRIMARY ALL NULL NULL 30 NULL
2 DERIVED e1 index ix_hiredate NULL 30252 Using index
3 UNION e2 index ix_hiredate NULL 30252 Using index
4 UNION e3 index ix_hiredate NULL 30252 Using index

DEPENDENT UNION

EXPLAIN SELECT * FROM employees e1 WHERE e1.emp_no
IN (
	SELECT e2.emp_no FROM employees e2.first_name='Matt'
	UNION
	SELECT e3.emp_no FROM employees e3 WHERE e3.last_name='Matt'
);
id select_type table type key ref rows Extra
1 PRIMARY e1 ALL NULL NULL 30252 Using where
2 DEPENDENT SUBQUERY e2 eq_ref PRIMARY func 1 Using where
3 DEPENDENT UNION e3 eq_ref PRIMARY func 1 Using where
NULL UNION RESULT <union2,3> ALL NULL NULL NULL Using temporary

UNION RESULT

SUBQUERY

EXPLAIN SELECT e.first_name, (
	SELECT COUNT(*)
	FROM dept_emp de, dept_manager dm
	WHERE dm.dept_no=de.dept_no
) AS cnt
FROM employees e WHERE e.emp_no=10001;
id select_type table type key rows Extra
1 PRIMARY e const PRIMARY 1 NULL
2 SUBQUERY dm index PRIMARY 24 Using index
2 SUBQUERY de ref PRIMARY 41392 Using index

DEPENDENT SUBQUERY

EXPLAIN SELECT e.first_name,(
	SELECT COUNT(*) FROM dept_emp de, dept_manager dm
	WHERE dm.dept_no=de.dept_no AND de.emp_no=e.emp_no
) AS cnt
FROM employees e 
WHERE e.first_name='Matt';

DERIVED

DEPENDENT DERIVED

EXPLAIN SELECT * 
FROM employees e
LEFT JOIN LATERAL
	(SELECT * FROM salaries s
	WHERE s.emp_no=e.emp_no
	ORDER BY s.from_date DESC LIMIT 2) AS s2
	ON s2.emp_no=e.emp_no;
id select_type table type key Extra
1 PRIMARY e ALL NULL Rematerialize ()
1 PRIMARY ref NULL
2 DEPENDENT DERIVED s ref PRIMARY Using filesort

UNCACHEABLE SUBQUERY

MATERIALIZED

EXPLAIN SELECT * FROM employees e
WHERE e.emp_no IN 
	(SELECT emp_no FROM salaries 
	WHERE salary BETWEEN 100 AND 1000);