반응형
공부하면서 메모한 내용들.
나중에 프로젝트할 때 참고하기.
[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) ?
- 책 뒤에 있는 색인(찾아보기)과 같은 원리
- 예: 책에서 "클라우드"를 찾을 때 전체 페이지 넘기지 않고 색인 페이지로 바로 이동
- 장점: 데이터 검색 속도 엄청 빨라짐
- 단점: 데이터 추가/수정할 때 인덱스도 같이 업데이트해야 해서 느려짐
# 인덱스 이해하기
- 일반 인덱스 (B-Tree)
- 도서관 책 분류처럼 순서대로 정렬됨
- 학생 정보를 학번순으로 빠르게 찾을 때 유용
- 대부분 DB에서 기본적으로 사용하는 방식
- 해시 인덱스
- 호텔 룸키같은 방식 (101호 → 1층 1번방)
- 정확한 값 찾기에 매우 빠름
- 예: 주민번호로 정확히 한 사람 찾기
- 전문 검색 인덱스
- 책의 단어 색인처럼 특정 단어가 어디에 나오는지 기록
- 블로그 글 내용 검색 등에 사용
# 인덱스 만들 때 기억할 것
- 자주 검색하는 컬럼에 인덱스 만들기
- 유니크한 값이 많은 컬럼이 인덱스로 좋음 (이름보다 주민번호가 더 효과적)
- 인덱스가 너무 많으면 오히려 성능 나빠짐 (적절히 사용하기)
- 작은 테이블은 인덱스 없이도 충분히 빠를 수 있음
[쿼리 최적화 방법]
# 느린 쿼리 빠르게 만들기
- 쿼리 실행 계획 보기
- DB에게 "이 쿼리 어떻게 실행할 건지" 물어보기 (EXPLAIN 명령어)
- 마치 내비게이션 경로 미리 확인하는 것과 같음
- 예: "아, 여기서 전체 테이블 스캔하네? 인덱스 추가해야겠다"
- 인덱스 잘 활용하기
- 검색 조건(WHERE)에 자주 사용되는 컬럼에 인덱스 만들기
- 정렬(ORDER BY)이나 그룹화(GROUP BY)에도 인덱스 활용
- 필요한 데이터만 가져오기
- SELECT * 대신 꼭 필요한 컬럼만 명시하기
- 예: 이름과 전화번호만 필요한데 모든 정보 다 가져오면 낭비!
# 쿼리 작성 시 꿀팁
- 필요한 것만 요청하기
- 모든 데이터 말고 필요한 것만 가져오기
- 예: 전체 게시글 대신 최근 10개만
- 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 '김%' (김씨 인덱스부터 찾아감)
- 인덱스 컬럼에 함수 쓰지 않기
- 테이블 조인 잘하기
- 작은 테이블부터 큰 테이블 순으로 조인하면 좋음
- 조인 조건에는 인덱스 꼭 사용하기
# NoSQL DB 빠르게 쓰는 팁
- MongoDB 사용할 때
- 자주 검색하는 필드에 인덱스 만들기
- 필요한 필드만 가져오기 (전체 문서 가져오지 않기)
- Redis 사용할 때
- 데이터 구조 적절히 선택하기 (List, Hash, Set 등)
- 필요없는 데이터는 자동 삭제되게 설정 (만료시간)
[DB 최적화 체크리스트 정리]
느린 쿼리 찾기 (로그 확인) |
EXPLAIN으로 실행 계획 확인해보기 |
적절한 인덱스 추가하기 |
쓸데없는 인덱스 제거하기 (오히려 성능 저하됨) |
쿼리 다시 작성해보기 (더 간단하게) |
DB 설정 확인 (메모리, 캐시 등) |
SQL이냐 NoSQL이냐는 정답이 없다.
은행 시스템처럼 데이터 정확성이 중요하면 SQL,
SNS나 로그 시스템처럼 대용량 처리가 중요하면 NoSQL이 좋음.
요즘엔 두 가지 섞어서 쓰는 경우도 많음.
인덱스는 검색 속도를 엄청 높여주지만 남용하면 오히려 느려짐.
다음 프로젝트에선 설계 단계부터 성능 생각하는 습관 들여야지!
728x90
반응형
'DB' 카테고리의 다른 글
데이터베이스 정규화 - 어디까지 해야 할까? (0) | 2025.05.26 |
---|---|
mongDB 테이블 생성 및 테스트 데이터 넣기 (0) | 2025.02.26 |
MongoDB 접속 (MongoDB Compass 사용) (0) | 2025.02.26 |
교육용 무료 Oracle XE 21c 설치 및 롤백 오류 해결 (1) | 2024.03.13 |
[ORACLE] 구분 값과 정렬 컬럼이 다른 경우 (0) | 2023.04.12 |