쿼리 최적화
SQL을 최적화할 수 있는 7가지 방법
1. SELECT 시에는 꼭 필요한 칼럼만 불러와야 한다.
많은 필드 값을 불러올수록 DB느 더 많은 로드를 부담하게 되기 때문에 칼럼 중에 불필요한 값을 가진 필드가 있다면 과감히 제외하고, 필요한 열만 불러오는 것이 좋다.
2. 조건 부여 시, 별도의 연산을 걸지 않는 것이 좋다.
Full Table Scan을 하는지 파악을 하면서 쿼리를 작성하는 것이 좋다.
예) 평점이 2점대를 찾을 때(만점이 5점)
FLOOR(avg/2) = 2 → Full Table Scan을 한 뒤 연산 진행
avg BETWEEN 4 and 5 → index를 활용해서 빠른 탐색 가능
3. LIKE 사용 시 와일드카드 문자열(%)을 String 앞부분에는 배치하지 않는 것이 좋다.
2번과 같은 원리이다. "value "%..."은 Full Table Scan을 활용하기 때문에 오래 걸릴 수 있다.
4. SELECT DISTINCT, UNION DISTINCT와 같이 중복 값을 제거하는 연산은 최대한 사용하지 않아야 한다.
중복값을 제거하는 연산은 많은 시간이 걸린다. 만약 불가피하게 사용해야 하는 상황이라면, DISTINCT 연산을 대체하거나, 연산의 대상이 되는 테이블의 크기를 최소화하는 방법을 고민할 필요가 있다.
대표적인 대체 방법으로는 EXISTS를 활용하는 방법이 있다.
5. 같은 내용의 조건이라면, GROUP BY 연산 시에는 가급적 HAVING 보다는 WHERE 절을 사용하는 것이 좋다.
쿼리 실행 순서에서, WHERE 절이 HAVING 절보다 먼저 실행된다. 따라서 WHERE 절로 미리 데이터 크기를 작게 만들면, GROUP BY에서 다뤄야 하는 데이터 크기가 작아지기 때문에 보다 효율적인 연산이 가능하다.
6. 3개 이상의 테이블을 INNER JOIN 할 때는, 크기가 가장 큰 테이블을 FROM 절에 배치하고, INNER JOIN 절에는 남은 테이블을 작은 순서대로 배치하는 것이 좋다.
대부분의 Query Planner에서 가장 효과적인 순서를 탐색해 INNER JOIN의 순서를 바꾼다.
하지만 JOIN 할 테이블이 많아진다면, 탐색해야 할 INNER JOIN순서의 경우의 수가 늘어나고, 이는 결국 Planning 비용의 증가로 이어진다.
그렇기 때문에 INNER JOIN 순서를 입력 단계에서 조정해 두는 것이 좋다.
7. 자주 사용하는 데이터의 형식에 대해서는 미리 전처리된 테이블을 따로 보관/관리하는 것도 좋다.
사용자에 의해 발생한 Log 데이터 중에서 필요한 Event만 모아서 따로 적재해 두는 것, 혹은 핵심 서비스 지표를 주기적으로 계산해서 따로 모아두는 것 등이 대표적으로 볼 수 있는 사례이다.
DB 로직 최소화
DB 로직을 최소화할 수 있는 10가지 방법
1. 일관된 데이터 모델링
DB 테이블과 엔티티를 일관성 있게 설계
중복 데이터를 피하고 정규화를 적용하여서 데이터 무결성 유지
2. 비즈니스 로직 분리
직접적인 비즈니스 로직을 내장시키는 것을 피하기 (select * from과 같은 SQL 문을 이용하여 DB에 영향을 주는 것)
서비스나 애플리케이션 레이어에서 비즈니스 로직을 처리하도록 분리
3. 조회 최적화
쿼리를 작성할 때 필요한 데이터만 조회
JOIN 등 복잡한 연산을 최소화
4. 쿼리 캐싱
자주 사용되는 쿼리 결과를 캐시 하여, 반복적인 쿼리 실행을 피하고 성능을 향상
5. 데이터 캐싱
자주 사용되는 데이터를 애플리케이션 내에 캐시
이를 통해, DB 접근을 줄이고 성능을 향상
6. 인덱스 활용
필요한 칼럼에 인덱스를 생성하여 검색 성능을 향상
7. 적절한 인덱스와 제약 조건 활용
DB 테이블에 인덱스와 제약 조건을 적절하게 활용하여, 데이터 무결성을 보장하고 검색 성능을 향상
8. 프로시저 및 함수 활용
DB 내부에서 로직을 처리하는 스토어드 프로시저나 함수를 사용
이를 통해, 애플리케이션과 DB 간의 통신을 최소화하고 성능을 개선
9. 트랜잭션 사용 최소화
필요하지 않은 범위에서 트랜잭션을 사용을 피하고, 트랜잭션 범위를 최소화
10. 배치 처리
대량의 데이터 처리 시, 적절한 커밋 주기와 배치 크기 설정으로 성능을 최적화
(배치 처리 : 데이터를 축적하다가, 일정 주기마다 일괄적으로 처리하는 방식)
참고
https://velog.io/@baekgom/DB-%EB% A1% 9C% EC% A7%81-%EC% B5% 9C% EC%86% 8C% ED%99%94
항해 개발자 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.
IT 커리어 성장 코스 항해99, 개발자 취업부터 현직자 코스까지
항해99는 실무에 집중합니다. 최단기간에 개발자로 취업하고, 현직자 코스로 폭발 성장을 이어가세요. 실전 프로젝트, 포트폴리오 멘토링, 모의 면접까지.
hanghae99.spartacodingclub.kr
'멋진 개발자 > DB' 카테고리의 다른 글
개발자 성장 기록 40 - Redis (0) | 2024.04.04 |
---|---|
개발자 취준 기록 31 - Primary Key, Foreign Key (1) | 2024.03.26 |
개발자 취준 기록 29 - DDL, DML, DCL (0) | 2024.03.25 |
[항해 취업코스] 개발자 취준 기록 21 - RDBMS의 정규화 (3) | 2024.03.14 |
[항해 취업코스] 개발자 취준 기록 20 - NoSQL과 RDBMS (0) | 2024.03.13 |