넓고 얕은 데이터베이스 지식
초보 개발자도 쉽게 이해할 수 있는 쿼리 최적화 방법
팡펑퐁
2023. 1. 23. 15:43
728x90
💡 쿼리 최적화
데이터 베이스에 쿼리를 날릴 때는 항상 최적화를 고려해야 한다. 쿼리 최적화 여부에 따라 성능이 달라지기 때문이다. 쿼리를 최적화해 주는 방법만으로 데이터베이스의 성능이 달라진다면 아무리 초보 개발자라 하더라도 꼭 공부해야 할 토픽임이 틀림없다. 최적화에는 복잡하고 어려운 여러 방법이 있겠지만 이 글에서는 글의 제목처럼 우리 할머니도 이해하고 바로 적용이 가능할 기본적인 쿼리 최적화 방법을 알아보려고 한다.
1. SELECT 시 모든 칼럼을 조회해야 하는 것이 아니라면 필요한 칼럼만 조회한다.
SELECT * FROM member; // X
SELECT id FROM member; // O
- 불필요한 칼럼까지 모두 조회하면 그만큼 데이터베이스의 성능을 저하될 수밖에 없다.
- 데이터베이스의 칼럼을 모두 조회하기 때문에 일부만 조회하는 것보다 데이터베이스에 부담을 주기 때문이다.
2. 조건을 걸 때는 가급적이면 기존 DB 값에 별도의 연산을 하지 않는다.
SELECT name FROM tables WHERE height + 10 = 170 // X
SELECT name FROM tables WHERE height >= 180 // O
- 칼럼에 별도의 연산을 걸게 되면 인덱스를 타지 않고 Full Scan을 하게 된다.
- Full Scan은 말 그대로 모두 조회하는 것이기 때문에 인덱스를 활용하는 것보다 긴 러닝타임을 가지게 된다.
- (Full Scan과 인덱스에 대한 설명)
3. LIKE 문을 사용할 때는 와일드카드 문자열(%)을 맨 앞에 사용하지 않는다.
SELECT member FROM tables WHERE name LIKE %스즈% // X
SELECT member FROM tables WHERE name LIKE 스즈% // O
- LIKE 문에서 와일드카드 문자열을 맨 앞에 사용하게 되면 인덱스를 타지 않고 Full Scan을 하게 된다.
- 2번 설명 참고
4. 중복을 제거하는 연산은 가급적이면 사용하지 않는다.
- 중복을 제거하는 연산(ex. DISTINCT)은 많은 시간을 소모한다.
- 중복을 제거해야 하는 상황에서는 DISTINCT 연산을 대체할 수 있는 EXISTS를 활용하는 방법을 생각해 보자.
5. 서브쿼리를 사용할 경우 IN 대신에 EXISTS를 사용한다.
- WHERE 문에서 서브 쿼리의 값을 확인할 때 IN 또는 EXISTS를 사용할 수 있다.
- 이때 서브 쿼리의 결과가 많을수록 EXISTS가 더 나은 성능을 제공하기 때문에 EXISTS를 사용한다.
6. 서브쿼리에서 ORDER BY를 사용하지 않는다.
- RDBMS마다 다르긴 하지만 서브쿼리에서 ORDER BY를 사용하는 경우 많은 비용이 발생한다.
7. 같은 조건이라면 GROUP BY 연산 시에 HAVING보다 WHERE 절을 사용한다.
- 같은 조건이라면 WHERE 절이 HAVING 절보다 먼저 수행되므로 WHERE 절로 데이터의 크기를 줄이고 GROUP BY에서 데이터를 다루는 것이 효율적인 연산 방법이다.
8. 암시적 변환을 사용하지 않는다.
- 암시적 변환은 데이터베이스에서 값을 비교할 때 데이터 타입이 다른 경우 자동으로 타입을 변환하는 것을 말한다.
- 이는 불필요한 자원을 소모시키므로 동일한 타입으로 비교하도록 한다.
참고
: https://medium.com/watcha/쿼리-최적화-첫걸음-보다-빠른-쿼리를-위한-7가지-체크-리스트-bafec9d2c073
728x90