DB 로직 최소화
1. DB 테이블과 엔티티를 일관성 있게 설계하여 중복 데이터를 피하고 정규화를 적용. 이를 통해 데이터 중복을 최소화 하고 데이터 무결성 유지 가능.
2. DB에 직접적인 비즈니스 로직을 내장시키는 것은 지양. 서비스나 애플리케이션 레이어에서 비즈니스 로직을 처리하도록 분리. DB의 부하를 줄이고 유지보수성 향상.
3. 필요한 데이터만 조회하고, JOIN등 복잡한 연산을 최소화. 필요한 데이터를 미리 계산하여 캐싱하거나, DB 뷰를 활용하여 미리 계산된 결과를 조회하는 방식을 고려
4. 필요한 컬럼에 인덱스를 생성하여 검색 성능을 향상. 과도한 인덱스 생성은 쓰기 성능에 부정적인 영향을 미칠 수 있으므로 적절한 선택/관리가 필요.
5. 자주 사용되는 쿼리 결과를 캐싱하여, 반복적인 쿼리 실행을 피하고 성능을 향상. 캐싱 시 데이터 갱신 주기와 데이터의 유효성을 고려.
6. 필요하지 않은 범위에서 트랜잭션 사용을 피하고, 트랜잭션 범위를 최소화. 트랜잭션은 데이터의 일관성과 무결성을 유지하기 위해 필요하지만, DB의 부하를 증가.
7. 대량의 데이터 처리시, 적절한 커밋 주기와 배치 크기 설정으로 성능을 최적화. 배치 처리는 데이터 처리량을 늘리고 DB의 부하 감소 가능.
쿼리 최적화
SQL (Structured Query Language) 쿼리를 분석하고 효율적인 실행 메커니즘을 결정하는 중요한 데이터베이스 관리 시스템 (DBMS) 구성 요소. 쿼리 최적화 프로그램은 각 쿼리에 대해 하나 이상의 쿼리 계획을 생성하며, 각 쿼리 계획은 쿼리를 실행하는 데 사용되는 메커니즘을 파악하고, 가장 효율적인 쿼리 계획을 선택되어 쿼리를 실행.
쿼리 최적화의 방법으로는 총 7가지가 존재.
1. 'SELECT * '사용 지양 : 쿼리를 최적화하는 가장 쉬운 방법으로 필요한 칼럼만 조회. 아스타리스크(*)를 사용하여 필요하지 않은 칼럼을 조회해야 하는 경우 불필요하게 리소스를 소모.
2. LIKE 검색시 와일드카드(%) 끝에 작성 : LIKE 검색시 와일드카드가 시작 부분에 있는 경우 인덱스를 활용하지 않기 때문 데이터베이스는 모든 레코드를 검색하므로 검색 속도가 느림.
3. 중복 제거
UNION과 DISTINCT를 같이 사용 X.
UNION에는 중복 값을 제거하는 기능이 존재하므로 DISTINCT와 함께 사용할 필요 X.
Distinct와 Group By를 함꼐 사용 X.
Group By절에 입력된 칼럼을 그룹화하므로 DISTINCT와 사용할 필요 X.
4. ORDER BY 금지 : RDBMS마다 다르지만 서브 쿼리(Sub Query)에서 Order By를 사용하는 경우 많은 비용이 발생
5. IN 대신 EXISTS 사용 : WHERE문에서 서브 쿼리의 값을 확인하려는 경우 IN 또는 EXISTS를 사용. IN과 EXISTS는 검색 결과에 따라 어느 것을 사용할지 결정. 서브 쿼리의 결과가 많으면 EXISTS가 나은 성능을 제공하며 그렇지 않으면 IN을 사용하는 것이 권장. EXISTS는 일치하는 항목이 발견되는 즉시 검색 프로세스를 종료하지만 IN은 모든 항목을 비교하기 때문.
6. WHERE문에 함수 사용 제한 : 컬럼이 인덱스로 잡혀있을 때 WHERE문에서 함수와 함께 사용되면 인덱스가 깨지므로 검색 속도가 느려지기 때문 인덱스로 잡혀있는 칼럼은 WHERE문 또는 JOIN에서 함수와 사용하는 것을 지양
7. 암시적 변환 금지 : 암시적 변환은 데이터베이스에서 값을 비교할 때, 데이터 타입이 다른 경우 데이터베이스에서 자동으로 타입을 변환 후 값을 비교하는 방식. 암시적 변환을 수행하는데 불필요한 리소스가 소모되므로 동일한 타입으로 값을 비교하는 것을 권장.
'메모 > DB' 카테고리의 다른 글
ORM (0) | 2023.10.01 |
---|---|
NoSQL vs RDBMS, DB 정규화, 기본키/외래키 (1) | 2023.09.20 |