sql 구문의 지연이 발생했을 때, 실행 계획을 살펴봐야 한다.
<MySQL 실행 계획 확인>
EXPLAIN SQL 구문
기본적인 SQL구문 실행 계획 3가지
table
select_type
type
rows
레코드 전체를 검색하는 단순한 SQL 구문의 실행 계획
EXPLAIN
SELECT * FROM point;
아래 실행계획을 보면, type이 all(풀스캔)인 것을 확인할 수 있다.
create table customer (
customer_id int not null,
customer_nm varchar(45) not null,
primary key (customer_id)
);
CREATE INDEX idx_customer_nm ON customer (customer_nm);
explain select * from customer where customer_nm='홍길동';
Extra에서 Using index를 사용한 것을 확인할 수 있다.
Using Index는 테이블에는 접근하지 않고 인덱스에서만 접근해서 쿼리를 해결함을 알 수 있다.
EXPLAIN
SELECT * FROM POINT P INNER JOIN USERS U
ON P.oauth_id = U.oauth_id;
id=2 Extra를 보면 hash join이라고 써져 있는데, 이것은 결합 알고리즘을 말한다.
결합 알고리즘
Nested Loops
: 한쪽 테이블을 읽으면서 레코드 하나마다 결합 조건에 맞는 레코드를 다른 쪽 테이블에서 찾는 방식
Sort Merge
: 결합 키로 레코드를 정렬하고 순차적으로 두개의 테이블을 결합하는 방법
Hash
: 결합 키값을 해시 값으로 맵핑하는 방법 → 해시테이블 생성이 필요 → 작업용 메모리 영역을 필요
실행 계획 읽는 방법
Profiling 활성화 여부 확인 ( Profiling : 쿼리 실행 시간 기록)
Profiling 활성화 설정
쿼리 실행
실행시간 확인
SQL 구문과 구문들이 어떠한 접근 경로로 데이터를 검색하는지 먼저 아는 것이 중요하다.
제대로 된 SQL 구문을 작성하려면 어떤 테이블 설정이 효율적인지, 구문이 주어졌을 때 어떠한 실행 계획이 나올지 예측할 수 있어야 한다.