노트

DB 인덱스와 트레이드오프

Database Index

백엔드#db#performance · 연결된 개념 14개

쉽게 말하면

DB 인덱스는 국어사전의 가나다순 정렬처럼, 특정 값으로 행을 빨리 찾도록 따로 정리해 둔 목록이에요. 처음부터 한 장씩 넘기지 않고 몇 번만 펼쳐서 원하는 쪽에 닿죠.

비유가 깨지는 곳 사전과 달리 인덱스는 테이블 옆에 따로 유지돼서, 행을 넣고 고칠 때마다 함께 고쳐야 하고 공간도 더 써요. 조회는 빨라지지만 쓰기는 느려지니 측정한 뒤 필요한 곳에만 걸어요.

DB 인덱스는 특정 컬럼 값으로 행을 빨리 찾도록 테이블 옆에 따로 유지하는 보조 자료구조(auxiliary data structure)다. 관계형 DB의 기본 인덱스는 정렬된 균형 트리(B-tree 계열)라서, 전체를 훑지 않고 트리를 따라 내려가 원하는 행에 닿는다.

CREATE INDEX idx_orders_customer ON orders (customer_id);
SELECT * FROM orders WHERE customer_id = 42;   -- 풀스캔 대신 인덱스 탐색

얻는 것과 내는 것

  • 조회가 빨라진다: 동등 비교, 범위 조건, 정렬(ORDER BY)에 쓰인다
  • 쓰기가 느려진다: INSERT·UPDATE·DELETE 때마다 인덱스도 함께 고쳐야 한다
  • 공간을 더 쓴다: 인덱스 자체가 디스크와 메모리를 차지한다
  • 인덱스가 너무 많으면 쓰기 부담만 커지고 옵티마이저(query optimizer) 선택도 흔들린다

잘 안 타는 경우

  • LIKE '%검색어'처럼 앞이 와일드카드인 패턴 → 전문 검색은 검색 엔진으로
  • 컬럼에 함수를 씌운 조건(WHERE lower(email) = ...) → 함수 기반 인덱스(expression index)를 따로 만든다
  • 복합 인덱스(composite index) (a, b)에서 b만으로 찾는 경우 → 앞 컬럼부터 쓰여야 한다
  • 값의 종류가 적은 컬럼(성별 등)은 효과가 작다. 실행 계획(execution plan, EXPLAIN)으로 확인한다

일반 법칙

읽기를 빠르게 하는 거의 모든 기법(인덱스, 캐시, 비정규화(denormalization), 읽기 복제본)은 쓰기 비용이나 정합성으로 값을 치른다.

같은 DB 안의 인덱스는 "쓰기 속도와 용량"으로, 검색 엔진·캐시·복제본처럼 저장소를 하나 더 두는 방법은 "동기화와 정합성"으로 값을 낸다(최종 일관성). 무작정 다 걸기보다 측정한 뒤 필요한 곳에 거는 것이 섣부른 최적화를 피하는 길이다. 트리 구조의 원리는 이진 탐색 트리와 이진 탐색를 본다.

출처: PostgreSQL 문서: Indexes Introduction · Multicolumn Indexes

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 데이터베이스 다중화

    같은 데이터를 여러 DB 서버에 복제해 두는 것. 가장 흔한 형태는 원본을 가진 주(Primary) 서버가 쓰기를 받고, 사본을 받는 부(Replica) 서버들이 읽기를 나눠 맡는 구조다.

  • IndexedDB와 idb

    IndexedDB는 브라우저에 구조화된 데이터를 대량으로 저장하는 트랜잭션 기반 키-값 데이터베이스다. idb는 이벤트·콜백 방식인 네이티브 API(Application Programming Interface)를 Promise로 감싼 1KB 남짓의 얇은 래퍼다.

  • 그래프

    정점(vertex, 노드)과 정점들을 잇는 간선(edge)으로 이루어진 자료구조. 트리도 그래프의 한 종류다. SNS 친구 관계, 지도와 경로, 웹 페이지 링크, 추천 시스템, 패키지 의존성처럼 "무엇과 무엇이 연결돼 있다"는 모든 것을 표현한다. 이 지식 맵도 노트를 정점, 링크를 간선으로 한 그래프다.

  • 데이터 무결성

    데이터 무결성(data integrity)은 저장된 데이터가 정확하고 일관되며 믿을 수 있는 상태로 유지되는 것이다. 재고가 100개로 보이는데 실제로 50개라면 무결성이 깨진 것이다. 관계형 DB는 이를 제약 조건(constraint)으로 강제한다.

  • 읽기 캐시 전략

    값비싼 연산 결과나 자주 읽는 데이터를 DB보다 빠른 메모리 저장소에 두고, 읽을 때 캐시를 먼저 보는 전략. 응답 속도를 높이고 DB 부하를 줄이며, 캐시 계층만 따로 확장할 수도 있다.

보기 옵션