장애 회의에서 DBA가 빠르게 말합니다. "슬로우 쿼리가 Full Scan 타고, 거기에 Deadlock까지 겹쳤어요. N+1도 의심되고, Replica 복제 지연으로 방금 쓴 데이터가 안 보인대요." PM·인프라인 당신은 이 말들이 각각 얼마나 심각한지, 무엇을 해야 하는지 판단해야 합니다. 이 사전은 DB·SQL 실무 용어를 빠르게 해독하고 대응 방향을 잡게 합니다. 깊은 진단은 Database 트랙의 심화 모듈로 연결합니다.
- 1트랜잭션·격리수준·잠금/데드락 용어를 듣고 심각도를 가늠할 수 있다
- 2인덱스·실행계획·Full Scan·N+1로 성능 문제 방향을 잡을 수 있다
- 3복제·샤딩·페일오버로 가용성/확장 구조를 이해할 수 있다
- 4DDL/DML/TCL과 JOIN 종류로 SQL 대화를 따라갈 수 있다
트랜잭션 · 잠금 · 격리
데이터 정합성을 지키는 메커니즘
| 용어 | 한 줄 뜻 | 신호/대응 | 중요도 |
|---|---|---|---|
| Transaction / Commit / Rollback | 한 묶음 작업 / 확정 / 취소 | 부분 실패 시 롤백 | ★★★ |
| Lock | 동시 변경을 막는 잠금 | 과하면 대기·데드락 | ★★ |
| Deadlock | 서로의 락을 기다려 멈춤 | 잠금 순서 일관화로 예방 → [[transaction-isolation]] | ★★ |
| Isolation Level | 동시성 격리 수준 | RC/RR/Serializable | ★★ |
| Read Committed / Repeatable Read / Serializable | 격리 수준 3종 | PG 기본 RC, MySQL 기본 RR | ★★ |
| Dirty Read / Phantom Read | 이상 현상(미커밋 읽기 / 행수 변화) | 격리 수준으로 방지 | ★★ |
핵심: 격리수준·이상현상·데드락의 깊은 내용은 [[transaction-isolation]]에서 다룹니다. PM은 "Serializable로 올리면 안전하지만 느려진다"는 트레이드오프만 알면 됩니다.
성능 — 인덱스·실행계획·N+1
느린 쿼리의 언어
| 용어 | 한 줄 뜻 | 신호/대응 | 중요도 |
|---|---|---|---|
| Slow Query | 느린 쿼리 | 실행계획부터 확인 | ★★★ |
| Query/Execution Plan | DB의 쿼리 실행 방법 | EXPLAIN으로 확인 → [[query-execution-plan]] | ★★★ |
| Full Scan / Index Scan | 전체 읽기 / 인덱스 읽기 | type:ALL=Full=느림 신호 | ★★★ |
| Index / Composite Index | 인덱스 / 복합 인덱스 | 등치조건 앞·범위 뒤 → [[indexes-basics]] | ★★★ |
| PK / FK / Unique / Constraint | 기본키/외래키/유니크/제약 | 데이터 무결성 | ★★ |
| N+1 Problem | 연관 조회가 N번 추가로 나감 | eager loading → [[orm-basics]] | ★★★ |
| Connection/Read/Query Timeout | 접속/읽기/쿼리 타임아웃 | 슬로우쿼리·풀고갈 동반 | ★★ |
핵심: "Full Scan"이 보이면 인덱스 부재 신호. "N+1"은 ORM 목록 조회의 단골 함정. 둘 다 [[query-execution-plan]]·[[orm-basics]]에서 깊이 다룹니다.
가용성·확장 — 복제·샤딩·백업
DB를 늘리고 지키는 구조
| 용어 | 한 줄 뜻 | 비고 | 중요도 |
|---|---|---|---|
| Replication / Master-Slave / Primary-Replica | 복제 / 쓰기-읽기 분리 | 읽기 분산·페일오버 → [[replication-ha]] | ★★ |
| Failover | 장애 시 대체로 전환 | Replica 승격 | ★★ |
| Sharding / Partition | 데이터를 쪼개 분산 / 분할 | 대용량 확장 | ★★ |
| Backup / Restore / Dump | 백업 / 복원 / 덤프 | 재해복구 기본 → [[backup-recovery-dr]] | ★★★ |
| Migration / DDL / DML / DCL / TCL | 스키마 변경 / 정의·조작·제어·트랜잭션 SQL | 안전 배포 → [[migration-versioning]] | ★★ |
| Sequence / Auto Increment | 자동 증가 ID | UUID 대비 → [[mysql-features]] | ★ |
| Trigger / Procedure / Function / View / Materialized View | DB 측 로직/뷰 | 캐싱·자동화 → [[views-stored-procedures]] | ★ |
JOIN·서브쿼리·배치
조회와 대량 처리 용어
| 용어 | 한 줄 뜻 | 비고 | 중요도 |
|---|---|---|---|
| Inner / Left / Right / Outer Join | 교집합 / 왼쪽보존 / 오른쪽보존 / 전체 | 누락 버그 주의 → [[joins-complete]] | ★★ |
| Subquery / CTE / Cursor | 중첩쿼리 / WITH절 / 커서 | 가독성·성능 → [[subqueries-cte]] | ★ |
| Batch Insert/Update / Upsert | 대량 삽입·수정 / 있으면수정없으면삽입 | 성능 → [[bulk-operations]] | ★★ |
| Pagination / Offset / Limit | 페이지 처리 | 큰 offset 느림 주의 | ★★ |
핵심: INNER vs LEFT JOIN을 혼동하면 "신규 회원이 보고서에서 누락"되는 버그가 납니다([[joins-complete]]). PM이 데이터 요구를 적을 때 "주문 없는 회원도 포함?"을 명시하면 이 혼동을 막습니다.
장애 로그에서 DB 용어 해독 — 직접 확인
DB 관련 로그/에러가 보이면 그 용어 자체가 대응 방향의 단서입니다.
grep -iE 'deadlock|lock wait timeout|slow query|connection timeout' app.log | tail
ERROR Deadlock found when trying to get lock (MySQL 1213)
→ 데드락. 잠금 순서 일관화·트랜잭션 짧게([[transaction-isolation]])
WARN Slow query 4.2s: SELECT * FROM orders WHERE status=...
→ 실행계획 확인, status 인덱스 검토([[query-execution-plan]])
ERROR Lock wait timeout exceeded (MySQL 1205)
→ 다른 트랜잭션이 락 오래 점유. 슬로우쿼리/미커밋 트랜잭션 의심
grep -iE 'deadlock|timeout|slow|lock wait' app.log | tail- "Deadlock found(1213)"는 보통 DB가 한쪽을 죽여 자동 복구 → 빈도가 높으면 잠금 순서·트랜잭션 길이 문제([[transaction-isolation]])
- "Slow query Ns"에서 N이 수 초면 실행계획부터: type:ALL(Full Scan)이면 인덱스 추가가 1순위([[query-execution-plan]])
- "Lock wait timeout(1205)"은 다른 트랜잭션이 락을 오래 쥔 것 → 미커밋 트랜잭션·슬로우쿼리가 원인. 커넥션 상태도 함께 확인([[connection-pooling]])
- 복제 지연으로 "방금 쓴 데이터가 안 보임"이면 읽기를 Replica가 아닌 Primary로 보내거나 일관성 요구를 재검토([[replication-ha]])
상황: 회원·주문 목록 화면이 데이터가 늘면서 급격히 느려집니다. DB 슬로우 로그엔 비슷한 작은 쿼리가 수백 개씩 반복됩니다.
원인: N+1 문제입니다. 목록 N건을 가져온 뒤 각 항목의 연관 데이터(작성자·상품 등)를 1건씩 추가 조회해 총 N+1번 쿼리가 나갑니다. ORM의 지연 로딩(lazy loading)에서 흔합니다([[orm-basics]]).
진단:
# 같은 형태의 작은 쿼리가 반복되는지(N+1 신호)
grep "SELECT .* FROM authors WHERE id" app.log | wc -l # 수십~수백이면 N+1
해결: eager loading(JOIN으로 한 번에)으로 N+1을 1~2번 쿼리로 줄입니다(JPA join fetch/@EntityGraph, SQLAlchemy joinedload). 깊은 내용은 [[orm-basics]]. PM·인프라는 "목록 화면이 데이터 늘며 느려진다"는 증상에서 N+1을 1순위로 의심해, 개발팀에 eager loading 적용을 요청하도록 방향을 잡습니다.
인프라/SRE로서 DB 용어는 모니터링·장애 대응의 핵심입니다 — 슬로우 쿼리·데드락·복제 지연·커넥션 풀을 대시보드([[glossary-observability]])로 보고, 임계 초과 시 이 사전이 의심 방향을 알려줍니다. 깊은 진단은 Database 트랙(transaction-isolation·query-execution-plan·connection-pooling·replication-ha)으로 이어집니다. PM은 이 용어를 알면 "DB가 느리다"는 모호한 보고를 "특정 쿼리 인덱스 부재 / N+1 / 복제 지연" 같은 구체적 원인으로 좁혀, 재발 방지를 백로그 우선순위로 올릴 수 있습니다.
다음 용어사전에서는 서비스 간 통신과 인증 — API·인증/인가 용어를 정리합니다.