Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- OPENPATH
- 패스트캠퍼스
- 자바
- Be
- Java
- 디자인강의
- Spring
- 백엔드 부트캠프
- 국비지원교육
- mysql
- UXUIPrimary
- baekjoon
- 내일배움카드
- 오픈챌린지
- KDT
- 티스토리챌린지
- 오픈패스
- 환급챌린지
- 국비지원
- UXUI챌린지
- 백엔드개발자
- 디자인교육
- 내일배움캠프
- 백준
- UXUI기초정복
- 국비지원취업
- 부트캠프
- 디자인챌린지
- 객체지향
- 오블완
Archives
- Today
- Total
군만두의 IT 공부 일지
[스터디3] 데이터베이스 - 06. 트랜잭션과 무결성 본문
목차
4.3 섹션인 트랜잭션 위주로 데이터베이스에 대해 정리합니다. 트랜잭션, 인덱스, 조인 모두 공부했던 내용이지만, 계속 복습이 필요한 것 같습니다. 실제 프로젝트에 적용할 때도 유익하니까요.
4장 데이터베이스
4.3 트랜잭션과 무결성
4.3.1 트랜잭션
- 트랜잭션: 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위. 여러 개의 쿼리들을 하나로 묶는 단위
- ACID: 원자성, 일관성, 독립성, 지속성
- 원자성(atomicity): 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징
- 일관성(consistency): 허용된 방식으로만 데이터를 변경해야 하는 것
- 격리성(isolation): 트랜잭션 수행 시 서로 끼어들지 못하는 것
- 격리 수준은 SERIALIZABLE, REPEATABLE_READ, READ_COMMITTED, READ_UNCOMMITTED가 있음.
- 격리 수준에 따라 팬텀 리드(phantom read), 반복 가능하지 않은 조회(non-repeatable read), 더티 리드(dirty read) 현상이 발생함.
- 지속성(durability): 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것
- 데이터베이스에서 체크섬, 저널링, 롤백 기능을 제공함.
- 트랜잭션의 데이터 무결성 보장
- 커밋(commit): 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어
- 롤백: 에러나 이슈 등으로 트랜잭션 전으로 돌릴 때 사용하는 명령어
- 트랜잭션 전파: 트랜잭션을 수행할 때 커넥션 객체를 넘겨서 수행하지 않고, 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것
4.3.2 무결성
- 무결성: 데이터의 정확성, 일관성, 유효성을 유지하는 것
이름 | 설명 |
개체 무결성 | 기본키로 선택된 필드는 빈 값을 허용하지 않음. |
참조 무결성 | 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 함. |
고유 무결성 | 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성 값은 모두 고유한 값을 가짐. |
NULL 무결성 | 특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL이 될 수 없다는 제약 조건임. |
▲ 무결성 종류 표
4.4 데이터베이스의 종류
4.4.1 관계형 데이터베이스
- 관계형 데이터베이스(RDBMS): 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 데이터베이스
- SQL 언어를 사용하며, MySQL, PostgreSQL, 오라클, SQL Server, MSSQL 등이 있음.
- MySQL: 대부분의 운영체제와 호환되어 가장 많이 사용하는 데이터베이스임.
- C, C++로 만들어졌음.
- MyISAM 인덱스 압축 스킬, B-트리 기반의 인덱스, 스레드 기반의 메모리 할당 시스템, 매우 빠른 조인, 최대 64개의 인덱스를 제공함.
- 대용량 데이터베이스를 위해 설계됨.
- PostgreSQL: 디스크 조각이 차지하는 영역을 회수할 수 있는 장치인 VACUUM이 특징임. SQL뿐만 아니라 JSON을 이용해서 데이터에 접근할 수 있음.
4.4.2 NoSQL 데이터베이스
- NoSQL(Not Only SQL): SQL을 사용하지 않는 데이터베이스
- MongoDB: 와이어드타이거 엔진이 기본 스토리지 엔진으로 장착된 키-값 데이터 모델에서 확장된 도큐먼트 기반의 데이터베이스
- JSON을 통해 데이터에 접근할 수 있고, Binary JSON(BJSON) 형태로 데이터가 저장됨.
- 스키마를 정해 놓지 않고 데이터를 삽입할 수 있음.
- redis: 인메모리 데이터베이스. 키-값 데이터 모델 기반의 데이터베이스.
- 기본적인 데이터 타입은 문자열(string)임.
- 셋(set), 해시(hash) 등을 지원함.
- MongoDB: 와이어드타이거 엔진이 기본 스토리지 엔진으로 장착된 키-값 데이터 모델에서 확장된 도큐먼트 기반의 데이터베이스
4.5 인덱스
4.5.1 인덱스의 필요성
- 인덱스(index): 데이터를 빠르게 찾을 수 있는 하나의 장치
- 인덱스를 설정하면 테이블 안에 내가 찾고자 하는 데이터를 빠르게 찾을 수 있음.
4.5.2 B-트리
- 인덱스는 B-트리라는 자료 구조로 이루어짐.
- B-트리: 루프 노드, 리프 노드, 브랜치 노드로 나뉨.
-- B-트리 예
[10 | 20] --(루트 노드)
/ | \
[5 | 7] [12 | 15] [25 | 30] --(브랜치 노드)
/ | \ / \ / \
[1|3] [6] [8|9] [11] [13|14] [22] [28|29] --(리프 노드)
- 인덱스가 효율적인 이유는 효율적인 단계 거쳐 모든 요소에 접근할 수 있는 균형 잡힌 트리 구조와 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 트리 깊이의 대수확장성 때문임.
4.5.3 인덱스 만드는 방법
- 데이터베이스마다 인덱스를 만드는 방법은 다름.
- MySQL
- 클러스터형 인덱스: 테이블당 하나를 설정할 수 있음. primary key 옵션이나 unique not null 옵션으로 만들 수 있음.
- 세컨더리 인덱스: 보조 인덱스로 여러 개의 필드 값을 기반으로 쿼리를 많이 보낼 때 생성해야 하는 인덱스. create index ... 명령어를 기반으로 만들 수 있음.
- MongoDB: 도큐먼트를 만들면 자동으로 ObjectID가 형성되며, 해당 키가 기본키로 설정됨. 세컨더리키도 부가적으로 설정해서 기본키와 세컨더리키를 같이 쓰는 복합 인덱스를 설정할 수 있음.
4.5.4 인덱스 최적화 기법
- 데이터베이스마다 다르지만 기본 골조는 같음.
- MongoDB 기반 인덱스 최적화 기법
- 인덱스는 비용임.
- 인덱스는 두 번(인덱스 리스트, 컬렉션 순) 탐색하도록 강요함.
- 컬렉션이 수정되었을 때 인덱스도 수정되어야 함.
- 쿼리에 있는 필드에 인덱스를 무작정 설정하는 것은 답이 아님.
- 항상 테스팅해야 함.
- 서비스에서 사용하는 객체의 깊이, 테이블의 양 등이 다르기 때문에 항상 테스팅하는 것이 중요함.
- 복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순으로 생성해야 함.
- 여러 필드를 기반으로 조회할 때 복합인덱스를 생성하는데 아래 생성 순서에 따라 성능이 달라짐.
- 어떠한 값과 같음을 비교하는 ==이나 equal이라는 쿼리를 인덱스로 먼저 설정함.
- 정렬에 쓰는 필드를 인덱스로 설정함.
- 다중 값을 출력해야 하는 필드(쿼리 자체가 >이거나 < 등 많은 값을 출력해야 하는 쿼리에 쓰는 필드)를 인덱스로 설정함.
- 카디널리티(유니크한 값의 정도)가 높은 순서를 기반으로 인덱스를 생성함.
- 여러 필드를 기반으로 조회할 때 복합인덱스를 생성하는데 아래 생성 순서에 따라 성능이 달라짐.
- 인덱스는 비용임.
4.6 조인의 종류
- 조인(join): 하나의 테이블이 아닌 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것
- MySQL에서는 JOIN이라는 쿼리로, MongoDB에서는 lookup이라는 쿼리(성능이 떨어짐)로 이를 처리할 수 있음.
- 조인의 종류(이미지 참고)
- 내부 조인(inner join): 왼쪽 테이블과 오른쪽 테이블의 두 행이 모두 일치하는 행
- 왼쪽 조인(left outer join): 왼쪽 테이블의 모든 행
- 오른쪽 조인(right outer join): 오른쪽 테이블의 모든 행
- 합집합 조인(full outer join): 두 개의 테이블을 기반으로 조인 조건에 만족하지 않는 행 모두
4.6.1 내부 조인
- 내부 조인: 두 테이블 간 교집합
SELECT * FROM TableA A
INNER JOIN TableB B ON
A.key = B.key
4.6.2 왼쪽 조인
- 왼쪽 조인: 테이블 B에서 일치하는 부분의 레코드와 테이블 A를 기준으로 완전한 레코드 집합을 생성함.
SELECT * FROM TableA A
LEFT JOIN TableB B ON
A.key = B.key
4.6.3 오른쪽 조인
- 오른쪽 조인: 테이블 A에서 일치하는 부분의 레코드와 테이블 B를 기준으로 완전한 레코드 집합을 생성함.
SELECT * FROM TableA A
RIGHT JOIN TableB B ON
A.key = B.key
4.6.4 합집합 조인
- 합집합 조인(완전 외부 조인): 양쪽 테이블에서 일치하는 레코드를 포함해 테이블 A와 테이블 B의 모든 레코드 집합을 생성함.
SELECT * FROM TableA A
FULL OUTER JOIN TableB B ON
A.key = B.key
4.7 조인의 원리
4.7.1 중첩 루프 조인
- 중첩 루프 조인(NLJ: Nested Loop Join): 중첩 for 문과 같은 원리로 조건에 맞는 조인을 하는 방법
- 랜덤 접근에 대한 비용이 많이 증가하므로 대용량 테이블에서는 사용하지 않음.
- 블록 중첩 루프 조인(BNL: Block Nested Loop): 조인할 테이블을 작은 블록으로 나눠서 블록 하나씩 조인하는 방법
4.7.2 정렬 병합 조인
- 정렬 병합 조인: 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 후에 조인 작업을 수행하는 조인
- 조인할 때 사용할 인덱스가 없고, 대용량의 테이블들을 조인하는 조건으로 범위 비교 연산자가 있을 때 사용함.
4.7.3 해시 조인
- 해시 조인: 해시 테이블을 기반으로 조인하는 방법
- 중첩 루프 조인보다 효율적임. 동등 조인에서만 사용할 수 있음.
- MySQL의 해시 조인 단계
- 빌드 단계: 입력 테이블 중 하나를 기반으로 메모리 내 해시 테이블을 빌드하는 단계
- 프로브 단계: 레코드 읽기를 시작하며, 각 레코드에서 일치하는 레코드를 찾아서 결과값을 반환함.
이 글은 『 면접을 위한 CS 전공지식 노트 』 책을 학습한 내용을 정리한 것입니다.
'학습일지 > CS 지식' 카테고리의 다른 글
[스터디3] 자료구조 - 08. 비선형 자료 구조 (0) | 2025.01.12 |
---|---|
[스터디3] 자료구조 - 07. 복잡도 및 선형 자료 구조 (0) | 2025.01.11 |
[스터디3] 데이터베이스 - 05. ERD와 정규화 과정 (0) | 2025.01.03 |
[스터디3] 운영체제 - 04. CPU 스케줄링 알고리즘 (1) | 2025.01.01 |
[스터디3] 운영체제 - 03. 프로세스와 스레드 (1) | 2024.12.24 |
Comments