Post

⚡ 데이터베이스 - 트랜잭션, 인덱스, 조인

⚡ 데이터베이스 - 트랜잭션, 인덱스, 조인

🔹 트랜잭션이란?

  • 데이터베이스에서 하나의 작업 단위를 의미한다.
  • 여러 SQL 문장이 하나의 논리적인 작업으로 묶여야 할 때 사용된다.
  • 모든 작업이 성공적으로 끝나야 커밋되며, 하나라도 실패하면 롤백된다.

🔹 트랜잭션의 ACID 4가지 속성

  1. 원자성(Atomicity): 트랜잭션은 모두 수행되거나 전혀 수행되지 않아야 한다.
  2. 일관성(Consistency): 트랜잭션이 성공적으로 완료되면 데이터는 항상 일관된 상태여야 한다.
  3. 격리성(Isolation): 여러 트랜잭션이 동시에 실행될 때 서로 간섭하지 않아야 한다.
  4. 지속성 (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.