MySQL 쿼리 최적화의 중요성

* 공부하면서 정리하는 포스팅

[실험 조건]
- MySQL 5.6
- "Log" Table -> 약 160만개의 Tuple / "Country" Table -> 약 200개의 Tuple
- vCPU 1, RAM 1GB, HDD

1. COUNT(*)과 COUNT(ID)의 차이

INDEX가 걸려있다고 하더라도, COUNT(*)가 COUNT(ID)에 비해 압도적으로 빠르다

> COUNT(*)은 B+ Tree를 따라 Tuple 갯수만 카운트하고 끝나지만
> COUNT(ID)는 직접 모든 Tuple을 열어서, NULL인지 값이 있는지 체크하기 때문

Tuple의 갯수를 카운트 할때는
특정 column을 지정해 카운트 하는 것 보단 COUNT(*)이 효율적이다.


2. ORDER BY

ORDER BY는 생각보다 많은 시간을 요하게 된다. (위 사진은 ORDER BY를 제한 결과)

특히 100만개x100개 정도를 filesort로 JOIN을 하게 되면,
해당 조건의 DB가 뻗어버린다.

> 상황에 따라선 정렬의 역할을 DB가 아니라 Application에서 하는게 좋을 지도 모른다


3. Primary Key 선정

위 사진 두개는 Primary Key가 char(3) 일때와 int 일때와의 차이이다.

> Primary Key는 가급적 int로 하면 좋다.

쿼리 하나에 6.91초가 걸리는 것도 말이 안되지만, 44.64초는 정말 폐급(?)이다.




DB는 나에게 정말 어려운 파트이다.

더 열심히 공부해야겠다.

댓글