Section 1. 데이터 베이스 기본
응용 프로그램 ∽ DBMS[제어/관리(조작) ← 쿼리] ∽ 데이터베이스(규칙, 구조화된 데이터)
- 실시간 접근성: 비정형적 질의 → 실시간 처리 및 응답
- 지속적 변화: 동적 데이터 변화(CRUD) → 최신 상태 유지
- 동시 공용: 다수 사용자 → 같은 데이터 이용 가능
- 내용에 의한 참조: 사용자 요구 데이터 내용으로(레코드 주소, 위치X) → 검색
엔터티(=객체)[여러개 내부 속성] - 강한 엔터티(독립존재가능) vs 약한 엔터티(종속적)
릴레이션(=테이블/컬렉션)
- 관계형 DB: 레코드 - [테이블] - 데이터베이스
- NoSQL: 도큐먼트 - [컬렉션] - 데이터베이스
RDBMS(관계형): 2차원 테이블 형태, 데이터 구조 명확
- 스키마에 맞춰 데이터 관리, 정합성 보장 ~ 중복 데이터X(데이터 무결성: 변경 용이) - 수정 필요 데이터 적합
- 시스템이 커지면 쿼리 복잡성 증가 & 성능 저하(Scale-Out X/Scale-Up)
NoSQL(Not Only SQL)
- 스키마 없이 Key-Value 형태로 자유롭게 데이터 관리(데이터 분산/확장 용이: Scale-Up + Scale-Out)
- 데이터 중복 가능(수정시, 모든 컬렉션 체크), 명확한 데이터 구조 보장 X
도메인: <속성, 속성> 묶음
개체 속성(=필드)
카디널리티(중복 수치 정도)
*MySQL 기준, 필드 타입
날짜: DATE, DATETIME, TIMESTAMP
문자: CHAR, VARCHAR(가변길이) + TEXT/BLOB + ENUM/SET
*SQL 문법
SELECT: 특정 테이블 조회
SELECT name, age FROM students;
DISTINCT: 중복 데이터를 제거 - 고유한 값 조회
SELECT DISTINCT country FROM users;
FROM: 데이터를 가져올 테이블 지정
SELECT name FROM students;
WHERE: 조건에 맞는 개별 데이터 필터링
SELECT * FROM students WHERE age > 20;
JOIN
둘 이상의 테이블 결합
SELECT students.name, courses.title FROM students JOIN enrollments ON students.id = enrollments.student_id JOIN courses ON enrollments.course_id = courses.id;
*ON: JOIN의 조건 지정
SELECT students.name, courses.title FROM students JOIN enrollments ON students.id = enrollments.student_id;
GROUP BY: 특정 필드 기준으로, 레코드를 그룹화
SELECT country, COUNT(*) FROM users GROUP BY country;
*COUNT, SUM, AVG, MAX, MIN 연산자 사용 가능
HAVING: GROUP BY 결과에 조건을 적용(그룹 필터링 & 집계함수 사용 가능)
SELECT country, COUNT(*) FROM users GROUP BY country **HAVING** COUNT(*) > 5;
ORDER BY: 결과를 지정된 컬럼 기준/수치로 정렬
SELECT name, age FROM students **ORDER BY** age DESC;
LIMIT: 결과 행의 수를 제한
SELECT name FROM students **LIMIT** 10;
[수행 우선순위]
FROM/JOIN (및 ON) - WHERE - GROUP BY/HAVING - SELECT - DISTINCT - ORDER BY - LIMIT
+ JOIN 명령어
Left Outer join: 집합 A
Right Outer join: 집합 B
Full Outer join: 합집합
Inner join: 교집합
JOIN의 내부 작업 방식
1. 중첩 루프 조인 (Nested Loop Join)
- 첫 번째 테이블(외부 테이블)의 각 행에 대해, 두 번째 테이블(내부 테이블)의 모든 행을 순회하며 매칭을 찾습니다(간단하지만, 테이블이 클 경우 비효율적)
2. 정렬 병합 조인 (Sort-Merge Join)
- 조인할 두 테이블을 정렬한 후 병합하는 방식
- 각 테이블의 커서가 필요해 좋은 성능을 보이나, 정렬이 필요한 경우 시간이 소요 가능
3. 해시 조인 (Hash Join)
- 빌드 단계: 작은 테이블에서 해시 테이블을 생성
- 프로브 단계: 큰 테이블의 각 행을 순회하면서 해시 테이블과 매칭 (특히 큰 데이터 세트에 효과적)
DDL(정의) - 구조 정의/수정/삭제 (ALTER, CREATE, DROP)
DML(조작) - CRUD (SELECT, INSERT, UPDATE, DELETE)
DCL(제어) - 무결성 유지, 병행 수행 제어, 보호 & 관리 (COMMIT, ROLLBACK, GRANT, REVOKE)
*DELETE: 테이블 유지 & 데이터 삭제[REDO 가능]
TRUNCATE: 전체 데이터 삭제(테이블 용량 감소/테이블 삭제X & 인덱스 삭제)[REDO 불가능]
DROP: 테이블 완전 삭제(공간/인덱스/객체 삭제)[REDO 불가능]
*트리거: 특정테이블에 대한 이벤트 발동 -> DML 자동 호출/수행
슈퍼키(유일성:중복X) { 후보키(+최소성: 최소필드만 사용/복합키X) (기본키 / 대체키) }
자연키(자연 생성된/변하는+속성) / 인조키(인위적+고유+식별자/불변성->기본키로 사용)
외래키(타 테이블-기본키 참조)
*SQL Injection [텍스트 필드 - SQL 구문삽입]
- 입력값 검증 함수 & 저장 프로시저(? 대입) 사용
Section 2. ERD & 정규화 과정
ERD(관계형 구조 1:1 / 1:N / N:M 관계)[시스템 요구사항 기반, 데이터베이스 구축~디버킹/비즈니스 프로세스 설계]
정규화 과정: 릴레이션 잘못된 종속 관계 해결(*데이터 이상 현상: 다중 삽입/삭제/갱신 이상), [저장 공간 효율적 분배/용량 축소]
*논리적 오류: 삽입 이상(특정 속성 값 없음 NULL 입력), 갱신 이상(중복 데이터 중 일부만 수정됨), 삭제 이상(다른 데이터까지 삭제)
- 제 1 정규형: 한 개의 기본키에 두 개 이상 반복 집합 X
- 제 2 정규형: 부분 함수 종속성 제거(모든 속성 기본키에만, 완전 함수 종속) - 무손실 분해(직접 상관성 없는 릴레이션~분해)
- 제 3 정규형: 이행적 함수 종속 제거 (A->B->C 연관성에서 축약가능, A/B & B/C 로)
- 보이스/코드 정규형(BCNF): 제 3 정규형 + 결정자이지만, 후보키가 아닌 경우 분해
* 정규형을 통해, 성능변화는 예측 불가(+/-<조인경우>) ~ 서비스에 따라 정규화 결정(읽기가 많은 작업은 역정규화)
트랜잭션: 데이터베이스 논리적 작업 수행 단위(하나 이상의 상태 변화)
[ACID 특성]
- Atomicity (원자성): 트랜잭션 모두 성공 or 실패 (부분적 X)
- Consistency (일관성): 허용된 방식(규칙)으로만 데이터 변경 가능
- Isolation (격리성): 다른 트랜잭션과 격리, 독립적 수행(병렬 접근 가능)
- Durability (지속성): 트랜잭션 종료 후, 결과 영구적 반영- 시스템 장애시, 원복 가능(체크섬: 무결성 보호~중복 검사<오류 정정>, 저널링:변경사항 로그, 롤백)
*Commit(CRUD 이후) & Rollback
-DB Lock (트랜잭션 처리 순차성 보장)
- 공유락 (Shared Lock): 트랜잭션(조회) 중, 동시 접근 가능
- 베타락(Exclusive Lock): 트랜잭션(데이터 변경) 중, 접근 비허용
*트랜잭션-전파 (EX, spring @Transactional: 여러 메소드에 걸쳐 처리)
트랜잭션 격리수준[하->상]∝1/동시성(반비례) :: 현상
- READ UNCOMMITTED: 다른 트랜잭션 변경사항 읽기 가능 :: Dirty Read(값 다름 가능)
- READ COMMITED: 커밋 완료 데이터만 조회 가능(기본 값)/다른 트랜잭션 접근 가능 :: Non-repeatable Read(값 다름 가능)
- REPEATABLE_READ: 한 트랜잭션 수정 행 - Phantom Read(MVCC 해결?) 다른 트랜잭션 접근 불가/새로운 행 추가는 가능
- SERIALIZABLE: 가장 엄격한 격리 수준, 위 문제 해결(단, 교착상태 가능/성능 저하)
무결성의 종류
개체 무결성 | 기본키는 NULL 불가 |
참조 무결성 | 외래 키 & 참조하는 테이블 값 동일 |
도메인 무결성 | 정해진 도메인 |
키 무결성 | 기본키 NOT NULL, 이외 중복/NULL 가능 |
NULL 무결성 | NOT NULL |
고유 무결성 | 특정 속성 값 = 각 행에서 고유해야 함 |
Section 3. 인덱스 구조
B-Tree로 인덱스 구현 (트리 높이 최소화 - 검색 시간↓: 균형 / 대수확장성<느리게 성장>)
- 자식 노드 2개 이상, LinkedList로 리프노드 연결~순차 검색 가능
- 노드: 루트(상위), 내부(중간), 리프(하위) 노드로 구성
- 트리 균형 유지: 자동으로 균형 유지
- 키 순서: 각 노드는 정렬된 키(데이터) 유지
- 탐색 및 삽입/삭제: O(log n) 시간 복잡도
[동작 방식]
- 인덱스 검색(READ)으로 테이블 내 자료 엑세스(항상 정렬된 상태 유지)
-> 삽입/수정/삭제 시 속도 저하 (저장 성능↓/검색 성능↑)
- 루트 노드에서 시작하여, 예측 항목이 있는 노드에서 키를 검색한다.
- 자식 노드로 이동하여 검색 및 찾으면 해당 노드 데이터 반환
- 키를 삽입하거나 삭제할 때는, 노드를 분할하거나 합병하여 트리의 높이를 유지한다.
* 해시 테이블로 구현시, 시간 복잡도 O(1) [But, 1가지 데이터 검색에만 용이/부등호 사용 등 연속적 데이터의 순차검색 불가]
* 복합인덱스 설정
Section 4. DBMS 스토리지 아키텍쳐
클러스터링 - 여러 개 DB 수평적 구조 구축(동기 방식으로 사용)
- 동기화 ~ 일관성있는 데이터
- 높은 가용성(다른 DB 사용/시스템 장애X)
- 로드 밸런싱 (DB서버 부하 분산)
* 저장소 공유시, 병목현상 (전체 시스템의 성능/용량 ~ 하나의 구성요소로 제한) 발생 가능 & 서버 동시 운영 비용↑
리플리케이션 - 여러 개 DB 수직적 구조로 구축(권한별로/비동기 방식)
- (일반적 DB)빈번한 읽기 작업 -> 성능 향상
- 지연 시간 거의 없음
* 데이터 동기화 보장 X -> 일관성 X & Master DB 다운시, 복구 및 대처 어려움
DB 튜닝이란? DB의 구조나, 운영체제 등 조정 → DB 시스템의 전체적인 성능을 개선
1단계 - DB 설계 튜닝(모델링 관점): DB 설계 단계에서 성능을 고려하여 설계
□ 데이터 모델링, 인덱스 설계, 데이터 파일, 테이블 스페이스 설계, 데이터베이스 용량 산정 등
- 튜닝 사례: 반정규화, 분산파일배치
2단계 - DBMS 튜닝(환경 관점)
□ 성능을 고려하여 메모리나 블록 크기 지정, CPU(메모리 I/O 관점)
- 튜닝 사례: Buffer/Cache 크기
3단계 - SQL 튜닝(App 관점)
□ SQL 작성 시 성능 고려: Join, Indexing, SQL Execution Plan
- 튜닝 사례: Hash / Join
RDBMS는 단순 텍스트매칭에 대한 검색만을 제공해 동의어나 유의어 같은 검색은 불가
*(MySQL 최신 버전에서 n-gram 기반의 Full-Text 검색을 지원)
But, 엘라스틱 서치는 동의어나 유의어를 활용한 검색이 가능, 비정형 데이터의 색인과 검색이 가능하고, 역색인 지원으로 매우 빠른 검색이 가능
※ Full-Text : 이미지, CSS, 글 등의 복합적으로 이뤄진 컨텐츠에서 순수하게 텍스트만 추출한 데이터를 의미. 이 과정을 보통 크롤링으로 구현함 ( 엘라스틱 서치의 검색엔진엔 크롤러가 빠져있어 별도로 구축해야함)
출처: https://dev-coco.tistory.com/158 [슬기로운 개발생활:티스토리]
MySQL(오픈 소스 관계형 데이터베이스 관리 시스템) - 여러 기능/아키텍쳐 요소
- 인덱스 압축 기술(인덱스 크기 줄임/쿼리 성능 향상
- B-트리 기반 인덱스(+최대 64개 인덱스)
- 스레드 기반 메모리 할당 시스템
- 빠른 조인 속도(연산 최적화 :: 조인 순서/알고리즘)
MySQL Server-Process
+-------------------------------------------+
| 클라이언트 - 어플리케이션(사용자-인터페이스) | : MySQL Connector & Shell(Scripting)
+-------------------------------------------+
|
|
v
+--------------------------------------+
| 커넥션 풀 (서버 엑세스~커넥션-할당/반환) | : 쓰레드 동시성 관리
+--------------------------------------+
|
| NoSQL/SQL Interface(DML/DLL/StroedProcidurs/Views/Triggers)
v
+-----------------+
| SQL 파서(Parser) | : SQL 구문해석+구문트리생성<쿼리정확성체크>
+-----------------+
|
|
v
+---------------------+
| 옵티마이저(Optimizer) | : 가능한 쿼리 실행 계획-최적 쿼리 플랜<조인 순서, 사용되는 인덱스, 결과 집합 접근방식 고려>
+---------------------+
|
|
v
+-------------------------+
| 쿼리 Caches & Buffers 풀 | : 자주 사용 데이터 메모리에 저장-빠른 엑세스 속도+메모리 구조체=:최근 엑세스 페이지<데이터+인덱스> 저장/재사용성) |
+-------------------------+
|
|
v
+----------------------------------+
| Storage Engine (InnoDB, MyISAM) | : 데이터 저장 및 처리/동시성 제어+ACID..데이터 조회 성능
+----------------------------------+
|
|
v
+------------+
| 파일 시스템 |
+------------+
|
| 저장/읽기
v
+---------------+
| 디스크 스토리지 |
+---------------+
# References
[도서] 면접을 위한 CS 전공지식노트 - 주홍철
https://dev-coco.tistory.com/158 [슬기로운 개발생활:티스토리]
'☺︎ Daily-Life > Full-time Job Interviews' 카테고리의 다른 글
[7~8/14 Sprint] 데이터의 구조 - 알고리즘 (2) | 2024.10.28 |
---|---|
[3~4/14 Sprint] 운영체제 (1) | 2024.10.23 |
The Hiring Process (1) | 2024.04.27 |