← 블로그 목록

Developer Knowledge

개발자가 알아야 할 지식: 데이터베이스 인덱스, 빠른 조회는 공짜가 아니다

인덱스가 읽기 성능을 높이는 방식과 쓰기 비용, 선택도, 실행 계획을 함께 보는 법을 정리합니다.

PostgreSQL Global Development Group
  • 개발자가 알아야 할 지식
  • Databases
  • Performance
  • SQL

데이터베이스 인덱스는 코드가 커지고 사용자가 늘어날수록 조용히 중요해지는 실무 개념입니다. 처음에는 세부 구현처럼 보이지만, 실제로는 시스템이 실패를 어떻게 다룰지 정하는 기준이 됩니다.

왜 개발자가 알아야 하나

데이터베이스 인덱스는 작은 코드 조각보다 시스템의 약속에 더 가깝습니다.

이 기준이 없으면 구현은 동작해도 운영 순간에 비용, 장애, 데이터 불일치가 드러납니다.

개발자가 이 개념을 알면 설계 결정의 이유를 더 분명히 설명하고, 장애가 나기 전에 위험을 줄일 수 있습니다.

핵심 개념

첫 번째 핵심은 경계입니다. 데이터베이스 인덱스가 적용되는 범위와 적용되지 않는 범위를 구분해야 합니다. 경계가 흐리면 예외 처리가 곳곳에 흩어지고, 나중에는 같은 문제가 서로 다른 방식으로 해결됩니다.

두 번째 핵심은 계약입니다. 서버, 클라이언트, 데이터베이스, 운영 도구가 어떤 값을 믿고 어떤 실패를 허용하는지 문서와 코드에 함께 드러나야 합니다.

세 번째 핵심은 관측 가능성입니다. 제대로 설계했는지 알려면 성공 경로뿐 아니라 거절, 충돌, 지연, 재시도 같은 사건도 로그와 지표로 확인할 수 있어야 합니다.

작은 예시 또는 체크리스트

주문 테이블에서 WHERE user_id = ? ORDER BY created_at DESC LIMIT 20 쿼리가 자주 쓰인다면 user_id만 있는 인덱스보다 (user_id, created_at) 복합 인덱스가 더 적합할 수 있습니다. 하지만 모든 필드에 인덱스를 붙이면 주문 생성과 업데이트가 느려집니다.

  • 느린 쿼리의 WHERE, JOIN, ORDER BY가 어떤 인덱스를 실제로 쓰는가?
  • 인덱스 컬럼의 선택도가 충분한가?
  • 복합 인덱스의 컬럼 순서가 실제 쿼리 패턴과 맞는가?
  • 쓰기 빈도가 높은 테이블에 불필요한 인덱스가 쌓여 있지 않은가?
  • EXPLAIN 결과를 보고 추측과 실제 실행 계획을 비교했는가?

실무에서 자주 생기는 오해

  • “인덱스는 많을수록 빠르다”는 오해가 있습니다. 인덱스는 읽기를 돕지만 쓰기와 저장 공간 비용을 늘립니다.

  • “컬럼 하나씩 인덱스를 만들면 된다”도 부족합니다. 실제 쿼리는 여러 조건과 정렬을 함께 사용합니다.

  • “개발 DB에서 빠르면 운영도 빠르다”는 판단은 위험합니다. 데이터 크기와 분포가 바뀌면 실행 계획도 바뀝니다.

오늘 바로 적용해보기

가장 느린 쿼리 하나를 골라 EXPLAIN을 읽어보세요.

사용되지 않는 인덱스를 찾아 제거 후보로 분류하세요.

새 인덱스는 어떤 쿼리를 빠르게 만들고 어떤 쓰기를 느리게 할지 PR에 적으세요.

더 알아보기

오늘의 takeaway

인덱스는 검색을 빠르게 하는 마법이 아니라, 읽기와 쓰기 사이의 명시적인 거래입니다.