⚡ 데이터베이스 - 트랜잭션, 인덱스, 조인
⚡ 데이터베이스 - 트랜잭션, 인덱스, 조인
🔹 트랜잭션이란?
- 데이터베이스에서 하나의 작업 단위를 의미한다.
- 여러
SQL
문장이 하나의 논리적인 작업으로 묶여야 할 때 사용된다. - 모든 작업이 성공적으로 끝나야 커밋되며, 하나라도 실패하면 롤백된다.
🔹 트랜잭션의 ACID
4가지 속성
- 원자성(
Atomicity
): 트랜잭션은 모두 수행되거나 전혀 수행되지 않아야 한다. - 일관성(
Consistency
): 트랜잭션이 성공적으로 완료되면 데이터는 항상 일관된 상태여야 한다. - 격리성(
Isolation
): 여러 트랜잭션이 동시에 실행될 때 서로 간섭하지 않아야 한다. - 지속성 (
Durability
): 커밋된 트랜잭션의 결과는 시스템 오류가 발생해도 유지되어야 한다.
🔹 트랜잭션 격리 수준
▫️ Read Uncommitted
- 커밋되지 않은 데이터를 읽을 수 있음
Dirty Read
발생 가능
▫️ Read Committed
- 커밋된 데이터만 읽을 수 있음
Non-repeatable Read
발생 가능
▫️ Repeatable Read
- 같은 쿼리를 여러 번 실행해도 같은 결과
Phantom Read
발생 가능
▫️ Serializable
- 가장 높은 수준, 완전한 격리
- 성능 저하 가능성 있음
🔹 인덱스란?
- 테이블의 검색 성능을 향상시키는 데이터 구조이다.
- 도서관의 책 색인처럼, 특정 값을 빠르게 찾을 수 있도록 도와준다.
▫️ 인덱스의 장점
- 검색 성능 향상
- 정렬이나 범위 검색에도 유리
▫️ 인덱스의 단점
- 데이터 삽입, 수정, 삭제 시 오버헤드 발생
- 잘못된 인덱스 설계는 오히려 성능 저하를 유발할 수 있음
▫️ 인덱스 사용 시 주의사항
🔺 너무 많은 인덱스는 오히려 성능 저하
- 인덱스가 많을수록
insert
,update
,delete
시 인덱스를 모두 갱신해야 하므로 오버헤드 발생
🔺 자주 변경되는 컬럼에는 인덱스 비추천
- 값이 자주 바뀌면 인덱스도 자주 변경되어 성능 저하
🔺 데이터가 너무 적으면 효과 없음
- 데이터 양이 적을 경우 인덱스보다 전체 탐색이 빠를 수 있음
🔺 조건에 인덱스 컬럼이 있어도 항상 사용되진 않음
- 함수나 연산을 사용하면 인덱스를 타지 못함
- 예:
WHERE DATE(created_at) = '2025-08-01'
→ 인덱스 무효
🔺 LIKE
검색은 패턴 위치에 따라 무효
LIKE 'abc%'
는 인덱스 사용 가능LIKE '%abc%'
는 전체 스캔 발생
🔺 복합 인덱스는 컬럼 순서가 중요
(a, b)
인덱스는WHERE a=...
또는a=... AND b=...
는 사용되지만WHERE b=...
단독은 인덱스 사용 안 됨
🔺 NULL
값 주의
- 일부 DB에서는 NULL이 포함된 컬럼에 인덱스가 제대로 작동하지 않거나, 동작 방식이 달라질 수 있음
🔺 통계정보와 실행계획 확인 필요
- 인덱스가 있다고 항상 쓰는 게 아니므로 실제 실행계획으로 인덱스 사용 여부를 확인해야 함 (
EXPLAIN
,ANALYZE
등)
🔹 조인의 종류
▫️ 내부 조인 (INNER JOIN
)
- 양쪽 테이블에 모두 존재하는 값만 반환
▫️ 외부 조인 (OUTER JOIN
)
- 왼쪽(
LEFT
), 오른쪽(RIGHT
), 양쪽(FULL
) 조인 - 한쪽에만 있는 값도 포함하여 반환
▫️ 교차 조인 (CROSS JOIN
)
- 모든 조합을 반환 (카티션 곱)
🔹 마무리
- 트랜잭션은 데이터의 신뢰성과 일관성을 보장하기 위해 반드시 필요한 개념이다.
- 인덱스와 조인도 데이터베이스 성능과 설계에서 중요한 요소이다.
This post is licensed under CC BY 4.0 by the author.