DB

SQL vs NoSQL 데이터베이스 & 최적화 기법 정리

ZZJJing 2025. 5. 9. 14:29
반응형

 

공부하면서 메모한 내용들.

나중에 프로젝트할 때 참고하기.


[SQL vs NoSQL 데이터베이스 차이점]

구조적 차이

  • SQL: 테이블 기반 구조. 스키마가 고정되어 있음. 행과 열로 데이터 표현
  • NoSQL: 유연한 스키마. 주요 유형:
    • 키-값 저장소 (Redis, DynamoDB)
    • 문서형 (MongoDB, CouchDB)
    • 컬럼 기반 (Cassandra, HBase)
    • 그래프 기반 (Neo4j, ArangoDB)

스케일링 방식 (확장성)

  • SQL: '위로' 확장 - 더 강력한 서버로 업그레이드 (램/CPU 추가)
    • 예: 8GB RAM → 16GB RAM, 2코어 → 4코어로 업그레이드
    • 한계: 결국 한 대 서버 성능에 제한됨
  • NoSQL: '옆으로' 확장 - 서버 대수를 늘림
    • 예: 서버 3대 → 10대로 확장, 부하 분산
    • 장점: 이론상 무제한 확장 가능

데이터 안정성 vs 가용성

  • SQL: 데이터 정확성 우선 (ACID)
    • 모든 거래(트랜잭션)는 완전히 성공하거나 완전히 실패해야 함
    • 은행 계좌 이체 같은 중요 데이터 처리에 적합
    • 예: A가 B에게 송금할 때, A 계좌 차감과 B 계좌 증가가 반드시 함께 이루어짐
  • NoSQL: 가용성과 성능 우선 (BASE)
    • 잠시 데이터가 일치하지 않아도 괜찮음
    • 결국에는 모든 서버의 데이터가 동기화됨
    • 페이스북 '좋아요' 같은 기능에 적합 (몇 초 지연되어도 큰 문제 없음)

쿼리 언어

  • SQL: 표준화된 SQL 사용
  • NoSQL: DB마다 다른 쿼리 언어/API 사용

적합한 사용 사례

  • SQL:
    • 데이터 구조가 명확하고 변경이 적은 경우
    • 복잡한 조인, 트랜잭션 필요 시
    • 금융, 회계, ERP 등 데이터 정확성 중요한 시스템
  • NoSQL:
    • 대용량 데이터 처리 필요
    • 빠른 개발 주기와 스키마 변경 많을 때
    • 분산 시스템 구축 시
    • 실시간 분석, IoT, 소셜 미디어 등

[데이터베이스 인덱싱]

# 인덱싱 (indexing) ?

  • 책 뒤에 있는 색인(찾아보기)과 같은 원리
  • 예: 책에서 "클라우드"를 찾을 때 전체 페이지 넘기지 않고 색인 페이지로 바로 이동
  • 장점: 데이터 검색 속도 엄청 빨라짐
  • 단점: 데이터 추가/수정할 때 인덱스도 같이 업데이트해야 해서 느려짐

# 인덱스 이해하기 

  1. 일반 인덱스 (B-Tree)
    • 도서관 책 분류처럼 순서대로 정렬됨
    • 학생 정보를 학번순으로 빠르게 찾을 때 유용
    • 대부분 DB에서 기본적으로 사용하는 방식
  2. 해시 인덱스
    • 호텔 룸키같은 방식 (101호 → 1층 1번방)
    • 정확한 값 찾기에 매우 빠름
    • 예: 주민번호로 정확히 한 사람 찾기
  3. 전문 검색 인덱스
    • 책의 단어 색인처럼 특정 단어가 어디에 나오는지 기록
    • 블로그 글 내용 검색 등에 사용

# 인덱스 만들 때 기억할 것

  • 자주 검색하는 컬럼에 인덱스 만들기
  • 유니크한 값이 많은 컬럼이 인덱스로 좋음 (이름보다 주민번호가 더 효과적)
  • 인덱스가 너무 많으면 오히려 성능 나빠짐 (적절히 사용하기)
  • 작은 테이블은 인덱스 없이도 충분히 빠를 수 있음

[쿼리 최적화 방법]

# 느린 쿼리 빠르게 만들기

  1. 쿼리 실행 계획 보기
    • DB에게 "이 쿼리 어떻게 실행할 건지" 물어보기 (EXPLAIN 명령어)
    • 마치 내비게이션 경로 미리 확인하는 것과 같음
    • 예: "아, 여기서 전체 테이블 스캔하네? 인덱스 추가해야겠다"
  2. 인덱스 잘 활용하기
    • 검색 조건(WHERE)에 자주 사용되는 컬럼에 인덱스 만들기
    • 정렬(ORDER BY)이나 그룹화(GROUP BY)에도 인덱스 활용
  3. 필요한 데이터만 가져오기
    • SELECT * 대신 꼭 필요한 컬럼만 명시하기
    • 예: 이름과 전화번호만 필요한데 모든 정보 다 가져오면 낭비!

# 쿼리 작성 시 꿀팁

  1. 필요한 것만 요청하기
    • 모든 데이터 말고 필요한 것만 가져오기
    • 예: 전체 게시글 대신 최근 10개만
  2. WHERE 절 사용 팁
    • 인덱스 컬럼에 함수 쓰지 않기
      • BAD: WHERE YEAR(birth_date) = 1990
      • GOOD: WHERE birth_date BETWEEN '1990-01-01' AND '1990-12-31'
    • 검색할 때 '%단어' 피하기 (단어% 는 괜찮음)
      • BAD: WHERE name LIKE '%김' (모든 이름 다 뒤져야 함)
      • GOOD: WHERE name LIKE '김%' (김씨 인덱스부터 찾아감)
  3. 테이블 조인 잘하기
    • 작은 테이블부터 큰 테이블 순으로 조인하면 좋음
    • 조인 조건에는 인덱스 꼭 사용하기

# NoSQL DB 빠르게 쓰는 팁

  1. MongoDB 사용할 때
    • 자주 검색하는 필드에 인덱스 만들기
    • 필요한 필드만 가져오기 (전체 문서 가져오지 않기)
  2. Redis 사용할 때
    • 데이터 구조 적절히 선택하기 (List, Hash, Set 등)
    • 필요없는 데이터는 자동 삭제되게 설정 (만료시간)

[DB 최적화 체크리스트 정리]

느린 쿼리 찾기 (로그 확인)
EXPLAIN으로 실행 계획 확인해보기
적절한 인덱스 추가하기
쓸데없는 인덱스 제거하기 (오히려 성능 저하됨)
쿼리 다시 작성해보기 (더 간단하게)
DB 설정 확인 (메모리, 캐시 등)

 

SQL이냐 NoSQL이냐는 정답이 없다.

은행 시스템처럼 데이터 정확성이 중요하면 SQL,

SNS나 로그 시스템처럼 대용량 처리가 중요하면 NoSQL이 좋음.

요즘엔 두 가지 섞어서 쓰는 경우도 많음.

인덱스는 검색 속도를 엄청 높여주지만 남용하면 오히려 느려짐.

다음 프로젝트에선 설계 단계부터 성능 생각하는 습관 들여야지!

 

728x90
반응형