데이터베이스
1. 데이터베이스에서 인덱스를 사용하는 이유 및 장단점
인덱스
: 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조.
사용하는 이유
- 테이블의 크기가 커질수록 특정 데이터를 찾는 작업은 전체 테이블 검색(Full Table Scan)이 발생하여 시간이 오래 걸린다.
- 인덱스는 특정 열의 데이터를 정렬된 구조 (B-tree, Hash 등)로 관리하여 검색 속도를 향상시키는 역할.
- 검색 시, 데이터베이스는 먼저 인덱스를 탐색한 후 해당 위치로 이동해 데이터를 조회한다.
장점
- 검색 속도 향상 : WHERE, ORDER BY, JOIN, GROUP BY 같은 쿼리에서 데이터 검색 및 정렬이 빨라진다.
- 쿼리 최적화 : 쿼리 실행 계획에서 Full Table Scan 대신 Index Scan을 사용하여 성능 최적화.
- 중복 방지 (유니크 인덱스) : UNIQUE 인덱스를 사용하면 중복 데이터를 자동으로 방지.
단점
- 추가 저장 공간 필요 : 별도의 저장 공간이 필요하며 테이블 크기에 따라 인덱스도 비례적으로 커질 수 있음.
- 쓰기 성능 저하 : 데이터의 삽입, 수정, 삭제 시 인덱스도 함께 업데이트되므로, 쓰기 작업의 속도가 느려질 수 있음.
- 복잡성 증가 : 너무 많은 인덱스 사용 시 인덱스 관리가 복잡해지고, 실제 쿼리 성능이 떨어질 수 있음.
- 잘못된 사용 : 잘못된 열에 인덱스를 생성하거나 과도한 인덱스를 생성하면 오히려 성능 저하.
적절한 상황
- 읽기 작업이 많은 경우 (SELECT)
- WHERE 조건이 자주 사용되는 열
- JOIN, ORDER BY, GROUP BY가 자주 사용되는 경우
인덱스는 데이터베이스에서 검색 성능을 향상시키기 위해 사용되는 자료구조입니다. 인덱스는 테이블의 특정 열에 대한 정렬된 구조를 만들어 데이터 검색 속도를 크게 향상시킬 수 있습니다. 장점으로는 검색 및 조회가 빨라지고, 정렬 및 그룹화 작업이 효율적이라는 점이 있습니다. 반면 단점으로는 인덱스를 저장하기 위한 추가 저장 공간이 필요하고, 데이터 삽입, 수정, 삭제 시 인덱스도 업데이트해야 하므로 쓰기 성능이 저하될 수 있습니다. 따라서, 인덱스는 읽기 작업이 빈번한 테이블에서 사용하면 효과적이지만, 쓰기 작업이 많은 경우에는 주의가 필요합니다.
2. 트랜잭션
트랜잭션
: 트랜잭션은 데이터베이스에서 논리적인 작업 단위를 하나의 그룹으로 묶은 작업입니다. 트랜잭션이 성공적으로 완료되면 그 작업의 모든 변경 사항이 데이터베이스에 반영되고, 실패하면 변경 사항이 취소(롤백)됩니다.
특성
: ACID
사용 사례
- 은행 업무 : 계좌 이체 (출금 -> 입금) : 두 작업이 반드시 함께 실행되거나 함께 취소되어야 함.
- 온라인 쇼핑 : 상품 재고 확인 -> 결제 처리 -> 주문 확정 : 이 모든 작업이 하나의 트랜잭션으로 처리되어야 함.
- 데이터 복구 : 오류 발생 시 트랜잭션 롤백으로 이전 상태로 복원.
장점
- 데이터 일관성과 무결성 보장
- 동시성 제어로 데이터 충돌 방지
- 오류 발생 시 데이터 복구 가능
단점
- 복잡한 트랜잭션 관리로 인한 성능 저하 가능
- 롤백 시 작업 취소로 인해 리소스 낭비 발생
- 높은 트랜잭션 수는 데이터베이스 부하 증가
트랜잭션은 데이터베이스에서 데이터의 일관성을 유지하기 위해 실행되는 하나의 논리적인 작업 단위입니다. 트랜잭션은 수행 중에 한 작업이라도 실패하면 변경사항이 취소(롤백)되고, 성공적으로 완료되면 그 작업의 모든 변경 사항이 데이터베이스에 반영됩니다.
3. ACID
1. Atomicity 원자성
- 트랜잭션은 하나의 작업 단위로 간주되며, 모든 작업이 성공하거나 모두 실패하거나.
- 데이터베이스는 중간 단계에서 실패할 경우 이전 상태로 롤백
- ex) 은행 계좌 이체 시 출금은 성공했지만 입금이 실패시 출금 작업도 취소됨
- 트랜잭션 로그, 롤백 기능
2. Consistency 일관성
- 트랜잭션 실행 전후 데이터베이스는 항상 일관된 상태를 유지해야 한다.
- 모든 무결성 제약 조건을 만족해야 한다.
- ex) 재고 관리 시스템에서 상품 출고 시 재고가 0보다 작아지지 않도록 보장.
- 무결성 제약 조건 (키 제약, 외래 키 제약 등)
3. Isolation 고립성
- 여러 트랜잭션이 동시에 실행될 때, 각각의 트랜잭션은 독립적으로 실행된 것처럼 보여야 한다.
- 트랜잭션 간 간섭을 방지하며 이를 위해 격리 수준을 조정한다.
- ex) 두 사용자가 같은 상품을 동시에 구매하려 할 때, 한 사용자의 작업이 끝난 후 다른 사용자가 처리된다.
- 트랜잭션 격리 수준 설정 (Read Uncommitted, Read Committed, Repeatable Read, Serializable)
4. Durability 지속성
- 트랜잭션이 완료되면 그 결과는 영구적으로 저장된다.
- 전원 장애, 시스템 오류가 발생해도 트랜잭션 결과는 손실되지 않음.
- ex) 결제 완료 후 시스템이 꺼져도 결제 기록은 유지됨.
- 로그 파일, 데이터 복제, WAL(Write-Ahead Logging) 사용.
중요성
- 데이터 무결성 보장 : 모든 작업이 완전하고 신뢰할 수 있도록 데이터 일관성을 유지
- 오류 복구 : 실패 시 트랜잭션 상태를 안전하게 복구
- 멀티유저 환경 지원 : 동시성 제어를 통해 여러 사용자가 데이터를 안정적으로 사용할 수 있음.
ACID는 데이터베이스 트랜잭션의 신뢰성과 무결성을 보장하기 위한 네 가지 속성입니다. 이는 원자성, 일관성, 고립성, 지속성을 말합니다. 원자성은 하나의 트랜잭션 내의 작업이 모두 성공해야 데이터베이스에 저장이 되고, 중간에 어느 한 작업이 실패하면 모든 작업이 실행되기 전으로 롤백되는 것을 말합니다. 일관성은 트랜잭션 실행 전후의 상태가 일관된 상태를 유지해야 하는 것입니다. 고립성은 여러 개의 트랜잭션이 동시에 실행될 때 각 트랜잭션이 독립적으로 실행되어야 하는 것입니다. 마지막으로 지속성은 트랜잭션이 완료되면 그 결과가 계속 지속되어야 하는 것으로 시스템 오류가 발생해도 유지된다는 것입니다.