데이터를 빠르게 찾고(인덱스), 편하게 재사용하고(뷰), 안전하게 처리하는(트랜잭션) 세 가지를 배워요. 실무에서 매일 마주치는 개념들이에요. 마지막 장까지 힘내요!
두꺼운 책에서 특정 단어를 찾을 때, 맨 앞부터 한 장씩 넘기면 너무 느려요. 그래서 책 뒤에는 색인(찾아보기)이 있죠 — "그 단어는 몇 페이지"라고 미리 정리해둔 표예요. 인덱스(INDEX)는 데이터베이스의 색인이에요. 특정 열에 색인을 만들어 두면, DB가 처음부터 전부 훑지 않고 바로 원하는 행으로 점프할 수 있어요.
-- users 테이블의 name 열에 인덱스 생성
CREATE INDEX idx_name ON users(name);
이렇게 name에 인덱스를 걸어두면, WHERE name = '철수' 같은 조회가 훨씬 빨라져요. 인덱스는 특히 WHERE(조건 검색) · JOIN(테이블 연결) · ORDER BY(정렬)에서 성능이 크게 좋아져요.
인덱스는 조회를 빠르게 하지만, 대가가 있어요. 인덱스도 결국 추가로 관리해야 하는 데이터이기 때문이에요.
| 구분 | 인덱스가 있으면 |
|---|---|
| 조회 (SELECT) | ✅ 빨라짐 — 색인으로 바로 점프 |
| 쓰기 (INSERT·UPDATE·DELETE) | ⚠️ 느려짐 — 데이터가 바뀔 때마다 색인도 같이 갱신해야 함 |
| 저장공간 | ⚠️ 더 씀 — 색인 자체가 공간을 차지함 |
INSERT하거나 UPDATE·DELETE하면, 테이블뿐 아니라 그 열에 걸린 인덱스(색인)도 함께 다시 정리해야 해요. 책에 내용을 추가할 때마다 뒤 색인도 고쳐야 하는 것과 같죠.
그래서 INSERT·UPDATE·DELETE(쓰기)는 느려지고, 인덱스가 차지하는 만큼 저장공간도 더 씁니다.
매번 길고 복잡한 SELECT를 다시 쓰긴 번거로워요. 뷰(VIEW)는 자주 쓰는 쿼리에 이름을 붙여 저장한 "가상 테이블"이에요. 한 번 만들어 두면, 그 뒤로는 진짜 테이블처럼 간단히 SELECT할 수 있어요.
-- 성인(20세 이상)만 보여주는 뷰 만들기
CREATE VIEW adult AS
SELECT * FROM users WHERE age >= 20;
-- 이제 뷰를 진짜 테이블처럼 사용
SELECT * FROM adult;
users의 데이터가 바뀌면, adult 뷰의 결과도 자동으로 최신 상태가 됩니다. 창(window)으로 원본을 들여다보는 셈이에요.
계좌 이체를 생각해봐요. "A에서 출금"과 "B에 입금", 두 작업이 있어요. 만약 출금은 됐는데 입금 도중 오류가 나면? 돈이 공중으로 사라져요. 그래서 이 둘은 반드시 하나로 묶여 처리돼야 해요.
트랜잭션은 여러 SQL 작업을 하나의 묶음으로 다루는 단위예요. 묶음 안의 작업이 모두 성공하면 COMMIT(확정), 하나라도 실패하면 ROLLBACK(전부 되돌리기)이에요.
BEGIN; -- 트랜잭션 시작
UPDATE accounts SET balance = balance - 100 -- ① A 계좌에서 출금
WHERE id = 1;
UPDATE accounts SET balance = balance + 100 -- ② B 계좌에 입금
WHERE id = 2;
COMMIT; -- 둘 다 성공 → 확정!
-- 만약 중간에 문제가 있었다면: ROLLBACK; -- 전부 취소, 원래대로
COMMIT: 출금·입금이 모두 확정돼요. 이체 완료!ROLLBACK: 출금까지 됐더라도 없던 일로 되돌려요. 돈이 사라지지 않아요.
💡 즉 트랜잭션은 "전부 되거나, 전부 안 되거나"를 보장해요. 중간에 어중간하게 끊긴 상태를 허용하지 않아요.
BEGIN(시작) · COMMIT(성공 확정) · ROLLBACK(실패 시 되돌리기). "성공하면 커밋, 실패하면 롤백" 이 한 줄만 확실히 기억하세요.트랜잭션이 믿을 수 있게 처리되려면 갖춰야 할 4가지 성질이 있어요. 앞글자를 따서 ACID라고 불러요.
| 글자 | 이름 | 뜻 |
|---|---|---|
| A | 원자성 (Atomicity) | 전부 성공 또는 전부 실패 (쪼개지지 않음) |
| C | 일관성 (Consistency) | 규칙을 지켜, 데이터가 항상 올바른 상태 유지 |
| I | 고립성 (Isolation) | 동시에 실행돼도 서로 간섭하지 않음 |
| D | 지속성 (Durability) | COMMIT된 결과는 영구히 남음 (장애에도 보존) |
CREATE INDEX idx_name ON users(name); — WHERE·JOIN·ORDER BY에서 빨라져요.CREATE VIEW adult AS SELECT ... — 복잡한 쿼리를 간단히 재사용, 실제 데이터는 따로 저장 안 함.