[TIL 2021.09.24] Real MySQL: 실행 계획 분석

4864 단어 Real MySQLReal MySQL

Today I Learned

from에 여러 테이블 가져올떄

select e.emp_no, e.first_name, s.from_date, s.salary
from employees e, salaries s;

그냥 두개의 테이블을 불러오는 쿼리.
from_datesalaryemp_no이 10001인 값으로 모두 표현되고 있음.

select e.emp_no, e.first_name, s.from_date, s.salary
from employees e, salaries s
where s.emp_no > 10001;

이렇게 하니까 emp_no 10002의 from_date가 오름차순에서 가장 빠른 날짜의 키의
from_date와 salary의 값을 가져온다.

참고로 salaries 의 emp_no과 from_date가 합쳐져 복합키이다.

결국엔 어쩃든간에 두개이상의 테이블을 의도하려는 대로 가져오려면 where절이 있어야한다.

select e.emp_no, e.first_name, s.from_date, s.salary
from employees e, salaries s
where e.emp_no = s.emp_no;

where절을 붙이니 아래와 같이 나옴.
e.emp_no은 기본키라 10001이 한개이고 s.emp_no은 10001이 여러개이다.
e.emp_no = s.emp_no이라는 조건을 주니까
e.emp_no과 e.first_name이 s.emp_no과 s.from_date에 맞춰서
아래와 같이 표현됨.

select e.emp_no, e.first_name, s.from_date, s.salary
from employees e
join salaries s
on e.emp_no = s.emp_no;

참고로 join으로 이렇게해도 똑같은 결과.

그래서 from에서 두개이상의 테이블을 불러오는 것도 "조인한다"라고 표현. (268p)


EXPLAIN

explain
select e.emp_no, e.first_name, s.from_date, s.salary
from employees e, salaries s
where e.emp_no = s.emp_no
limit 10;

explain 실행했을 때 레코드는 쿼리에서 사용된 테이블의 갯수만큼 나온다.

id가 낮을수록 즉 위에 있을 수록 쿼리의 바깥부분이거나 먼저 접근한 부분이고,
id가 높을수록 즉 아래에 있을 수록 쿼리의 안쪽부분이거나 나중에 접근한 부분이다.

MySQL은 필요에따라 실행계획을 산출하기 위해 쿼리의 일부분을 직접 실행할 때도 있어서 쿼리 자체가 복잡하고 무거우면 실행 계획의 조회도 느려질 가능성이 있다.

좋은 웹페이지 즐겨찾기