- 수직 확장
- CPU, RAM, 스토리지를 추가하는 것
- 인덱싱
- 만약 READ에 병목이 있다면, 인덱싱을 통해 테이블의 모든 행을 스캔하지 않고도 데이터를 빠르게 찾을 수 있게 하는 게 도움이 될 수도 있음
- 샤딩
- 데이터를 쪼개서 분산 저장
- 수직 분할
- 하나의 큰 테이블을 여러 개의 테이블의 조합으로 나누는 것
- product, product_detail, product_price 등으로 쪼개는 것 등
- 쿼리 중에 읽는 데이터 양을 줄이는 쪽으로 고려해야 함
- 캐싱
- 자주 접근하는 데이터 (변경이 적다면 더 좋음)를 캐싱
- Replication
- 지리적으로 멀리 떨어진 사용자들이 높은 latency를 겪고 있다면, 데이터베이스를 복제해 각 지역에 위치시키는 것이 도움이 됨
- 동기식 복제: 변경사항이 모든 복제본에 반영된 후에야 트랜잭션 완료. 큰 오버헤드.
- 비동기식 복제: 데이터 변경사항이 약간의 지연 시간을 두고 각 복제본들에 반영. 정합성 이슈.
- Materialized View
- 자주 수행하는 조회 쿼리의 경우 아예 view로 만들어 두면 리소스 집약적인 쿼리의 성능을 크게 향상시킬 수 있음.
- 데이터 비정규화
- 복잡한 JOIN의 필요성을 줄이기 위해 여러 테이블을 하나로 결합.
- 복잡한 JOIN은 큰 테이블에서 종종 느린 원인이 됨.