pbj0812의 코딩 일기

[SQL] not in 과 left join 연산 시간 비교 실험(2/2) 본문

ComputerLanguage_Program/SQL

[SQL] not in 과 left join 연산 시간 비교 실험(2/2)

pbj0812 2020. 10. 15. 22:46

0. 목표

 - not in 과 left join 연산 시간 비교 실험

 - index 변경 / 추가

1. 실습 준비

 1) 데이터 및 테이블 생성 (링크)

 2) index 확인

  - 없음

SHOW INDEX FROM sql_test.df_a;
SHOW INDEX FROM sql_test.df_b;

 3) 테이블에 index 추가

ALTER TABLE sql_test.df_a ADD INDEX idx (a);
ALTER TABLE sql_test.df_b ADD INDEX idx (a);

 4) index 확인

  - btree 형식

SHOW INDEX FROM sql_test.df_a;
SHOW INDEX FROM sql_test.df_b;

2. 실습1

 1) not in 을 통한 연산

  - 0.084 sec / 0.0000081 sec

SELECT COUNT(A.a)
FROM sql_test.df_a AS A
WHERE
	A.a not in (
		SELECT a FROM sql_test.df_b);

 2) left join 을 통한 연산

  - 0.215 sec / 0.000015 sec

SELECT COUNT(A.a)
FROM sql_test.df_a AS A
LEFT JOIN sql_test.df_b AS B
ON A.a = B.a
WHERE B.a IS NULL;

3. 실습2

 - pk 부여

ALTER TABLE sql_test.df_a ADD PRIMARY KEY (a);
ALTER TABLE sql_test.df_b ADD PRIMARY KEY (a);

 1) not in 을 통한 연산

  - 0.039 sec / 0.000017 sec

  - index 만을 부여하였을 때 대비 연산시간이 절반으로 감소 

SELECT COUNT(A.a)
FROM sql_test.df_a AS A
WHERE
	A.a not in (
		SELECT a FROM sql_test.df_b);

 2) left join 을 통한 연산

  - 0.337 sec / 0.0000081 sec

  - index 만을 부여하였을 때 대비 연산시간이 1.5배 증가

SELECT COUNT(A.a)
FROM sql_test.df_a AS A
LEFT JOIN sql_test.df_b AS B
ON A.a = B.a
WHERE B.a IS NULL;

4. 결과

 - index 를 부여하면 하지 않았을 때 대비하여 시간이 확연히 주는 것을 확인

 - not in 보다 left join이 연산량이 빠르다는 것도 항상 옳은 이야기는 아님

5. 참고

 - [데이터베이스] mysql에서 primary key 수정하기

 - [mysql] 인덱스 생성, 삭제, 확인

 - MySQL 인덱스(INDEX) 사용 방법

Comments