데이터베이스 최적화를 부르는 다른 표현으로는 "성능 튜닝(Performance Tuning)" 또는 "퀘리 최적화(Query Optimization)" 같은 용어가 있지만 "데이터베이스 튜닝(Database Tuning)"이라는 단어가 가장 대표적이다.
- 적절한 인덱스 사용 : 테이블에 인덱스를 생성하면 데이터 검색 속도가 크게 향상(인덱스를 과도하게 사용하면 업데이트와 삽입 속도가 느려질 수 있으므로 적절한 균형 필요)
- 최적의 쿼리 작성 : 불필요한 하위 쿼리, 중복된 조인, 데이터베이스에 과부하를 줄 수 있는 복잡한 연산을 줄이기
- 조회 범위 줄이기 : SELECT * 은 모든 열을 가져오므로 비효율적(필요한 열만 명시하여 선택적으로 데이터를 조회)
- JOIN 최적화 : 다중 테이블을 JOIN할 때 조인 순서, 인덱스 사용 여부, 조인된 테이블의 크기 등을 고려해 최적화
- B-Tree 인덱스 : 가장 일반적인 인덱스 구조로, 정렬된 데이터에 유용
- 해시 인덱스 : 정확한 값을 조회할 때 매우 효율적이지만 범위 검색에는 적합하지 않음
- 복합 인덱스(Composite Index) : 여러 컬럼을 결합한 인덱스로, 자주 함께 사용되는 컬럼에 대해 인덱스를 생성해 성능을 개선
- 클러스터드 인덱스(Clustered Index) : 테이블 내 데이터를 물리적으로 정렬하는 인덱스(클러스터드 인덱스는 테이블당 하나만 존재할 수 있으며, 기본적으로는 기본 키에 적용됨)
- 정규화(Normalization) : 데이터의 중복을 제거하고, 데이터 무결성을 보장하기 위해 테이블을 여러 개로 나누는 방식
- 비정규화(Denormalization) : 읽기 성능을 개선하기 위해 일부 중복을 허용하는 구조로 변경하는 방법(읽기 성능은 향상되지만, 데이터 수정 시 복잡도 증가)
- 파티셔닝(Partitioning) : 큰 테이블을 논리적으로 분할하여 성능을 최적화(데이터베이스 파티셔닝은 주로 대용량 데이터를 처리하는 시스템에서 사용)
- 데이터베이스 내부 캐시 : 쿼리 결과나 실행 계획을 데이터베이스 자체에서 캐싱
- 애플리케이션 레벨 캐싱 : Redis나 Memcached 같은 분산 캐시 시스템을 사용해 애플리케이션에서 자주 조회되는 데이터를 캐시
- 디스크 I/O 최적화 : SSD(Solid State Drive)를 사용하면 디스크 읽기/쓰기 성능이 개선
- 메모리 할당 : 데이터베이스 서버의 메모리가 충분하다면 더 많은 데이터를 메모리에 캐싱할 수 있어 성능이 향상(DBMS에서 메모리 크기를 적절히 설정하는 것이 중요)
- 병렬 처리 : 데이터베이스 서버가 다중 CPU 코어를 사용할 수 있도록 설정하여 병렬로 쿼리를 처리
- 트랜잭션 크기 줄이기 : 하나의 트랜잭션에서 너무 많은 데이터를 처리하면 잠금 경합이 발생할 수 있음(작은 트랜잭션으로 분할하면 성능이 개선)
- 잠금 경합 줄이기 : 여러 트랜잭션이 동일한 데이터를 동시에 수정하려고 할 때 잠금이 발생(적절한 인덱스 사용이나 트랜잭션 분리로 잠금 경합을 줄일 수 있음)