티스토리 뷰
웹 개발 실무 기술 A to Z # 5 - 데이터베이스 성능 최적화: 인덱싱, 샤딩, 캐싱 전략
octo54 2025. 2. 24. 12:57웹 개발 실무 기술 A to Z
웹 애플리케이션의 성능을 높이기 위해서는 데이터베이스(DB) 최적화가 필수적입니다.
데이터가 많아질수록 쿼리 속도 저하, 서버 부하 증가, 트랜잭션 병목 현상이 발생할 수 있습니다.
이번 글에서는 인덱싱, 샤딩, 캐싱 전략을 활용하여 데이터베이스 성능을 최적화하는 방법을 알아보겠습니다.
1. 데이터베이스 성능 최적화가 중요한 이유
✔️ 빠른 검색 속도 → 인덱스를 활용하여 쿼리 실행 속도 향상
✔️ 서버 부하 감소 → 캐싱을 통해 반복적인 DB 조회 최소화
✔️ 확장성 확보 → 샤딩을 통해 트래픽 증가에도 안정적인 운영 가능
2. 인덱싱 (Indexing) – 쿼리 속도 최적화
2-1. 인덱스란?
인덱스(Index)는 DB 테이블의 특정 컬럼을 빠르게 검색하기 위한 데이터 구조입니다.
✔️ 대량의 데이터에서도 빠른 검색 가능
✔️ WHERE, ORDER BY, JOIN 연산 최적화 가능
2-2. 인덱스 적용 예제
(1) MySQL에서 기본 인덱스 생성
CREATE INDEX idx_user_email ON users(email);
- users 테이블의 email 컬럼에 인덱스를 추가
- 이후 WHERE email = 'user@example.com' 같은 검색 속도 향상
(2) 인덱스 적용 전후 성능 비교
EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';
- 인덱스 미적용 시: Full Table Scan 발생 → 전체 데이터를 검색
- 인덱스 적용 시: Index Scan 발생 → 특정 데이터만 빠르게 조회
✅ 자주 검색되는 컬럼에는 인덱스를 추가하여 성능 향상 가능!
2-3. 인덱스 사용 시 주의할 점
✔️ 과도한 인덱스 사용 금지 → 인덱스가 많으면 INSERT/UPDATE 속도 저하
✔️ 고유한 데이터에 적합 → 중복 값이 많은 컬럼에는 인덱스 효과가 낮음
3. 샤딩 (Sharding) – 대규모 트래픽 분산 처리
3-1. 샤딩이란?
샤딩(Sharding)은 데이터를 여러 개의 데이터베이스 서버로 분산하여 저장하는 방식입니다.
✔️ 트래픽 증가 시 데이터베이스 부하 분산 가능
✔️ 데이터 저장 용량 증가
✔️ 단일 DB 장애 발생 시 전체 서비스 다운 방지
3-2. 샤딩 방식
샤딩 유형 설명 예제
수평 샤딩 (Horizontal Sharding) | 동일한 테이블을 여러 개의 DB로 나눔 | users_1, users_2 |
수직 샤딩 (Vertical Sharding) | 테이블을 분리하여 저장 | user_info, user_logs |
해시 기반 샤딩 (Hash Sharding) | 특정 키 값을 해싱하여 DB 분산 | user_id % 3 → 해당 DB 저장 |
3-3. 샤딩 구현 예제
✔️ 예제: User ID 기반 수평 샤딩
function getDatabaseShard(userId) {
const shardNumber = userId % 3; // 3개의 샤드로 분산
return `database_${shardNumber}`; // 해당 샤드에서 데이터 조회
}
✅ 사용자 ID를 기반으로 특정 데이터베이스에서 조회하여 부하를 분산할 수 있음!
4. 캐싱 (Caching) – 자주 사용되는 데이터 미리 저장
4-1. 캐싱이란?
✔️ 자주 사용되는 데이터를 저장하여 DB 조회 감소
✔️ API 응답 속도 향상 및 서버 부하 감소
4-2. 캐싱 전략
캐싱 방식 설명 예제
클라이언트 캐싱 | 브라우저, 모바일 앱에서 데이터 저장 | LocalStorage, IndexedDB |
서버 캐싱 | 웹 서버에서 API 응답을 저장 | Redis, Memcached |
CDN 캐싱 | 정적 파일(이미지, CSS, JS) 저장 | Cloudflare, AWS CloudFront |
4-3. Redis를 이용한 서버 캐싱
(1) Redis 설치 및 설정
npm install redis
(2) Redis 캐싱 미들웨어
const redis = require("redis");
const client = redis.createClient();
const cacheMiddleware = (req, res, next) => {
const key = req.originalUrl;
client.get(key, (err, data) => {
if (err) throw err;
if (data) return res.json(JSON.parse(data)); // 캐시된 데이터 반환
next(); // 캐시에 데이터 없으면 다음 미들웨어 실행
});
};
(3) API 응답 캐싱
app.get("/api/products", cacheMiddleware, async (req, res) => {
const products = await Product.find(); // DB 조회
client.setex(req.originalUrl, 3600, JSON.stringify(products)); // 1시간 캐싱
res.json(products);
});
✅ Redis를 활용하면 반복적인 DB 조회 없이 빠르게 데이터를 제공 가능!
5. 데이터베이스 성능 최적화 적용 전후 비교
5-1. 최적화 적용 전
- 데이터 양 증가 → 검색 속도 저하
- 동일한 요청 반복 처리 → DB 부하 증가
- 트래픽 증가 시 서비스 장애 발생 가능
5-2. 최적화 적용 후
✔️ 인덱싱 → 검색 속도 10배 이상 향상
✔️ 샤딩 → 대용량 트래픽도 안정적으로 처리 가능
✔️ 캐싱 → 서버 부하 감소 및 응답 속도 개선
✅ 데이터베이스 최적화를 적용하면 서비스 성능이 크게 향상될 수 있음!
6. 마무리 및 다음 글 예고
이번 글에서는 **데이터베이스 성능 최적화 방법 (인덱싱, 샤딩, 캐싱)**을 다뤘습니다.
다음 글에서는 마이크로서비스 아키텍처(MSA)와 API Gateway 활용법을 소개하겠습니다.
다음 글 예고: "마이크로서비스 아키텍처(MSA) – API Gateway와 서비스 분리 전략" 🚀
'project > 웹 개발 실무 기술 A to Z' 카테고리의 다른 글
- Total
- Today
- Yesterday
- 리액트
- 개발블로그
- AI챗봇
- 로컬LLM
- Next.js
- rag
- babel
- 관리자
- til
- kotlin
- 페이지
- LangChain
- Project
- nextJS
- llm
- PostgreSQL
- 웹개발
- Docker
- fastapi
- 백엔드개발
- Ktor
- Webpack
- 챗봇개발
- Page
- Python
- 백엔드
- nodejs
- 프론트엔드
- github
- REACT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |