Contents
블로그

데이터가 많아지니까 검색이 느려져요

응답 시간이 긴 쿼리와 실행 계획을 추적해 필요한 인덱스만 정밀 구성하는 방법

2026-08-23 · 읽는 시간 8분

검색성능성능최적화검색 엔지니어링

데이터가 많아지면 검색이 느려지는 이유는 무엇일까요?

데이터베이스가 모든 데이터를 일일이 확인하는 전체 스캔 때문입니다. 이 문제를 해결하려면 검색 조건에 맞는 인덱스(색인)를 정확히 만들고, 검색 속도가 느려지는 진짜 원인이 데이터베이스 때문인지 먼저 확인해야 해요. UQA로 응답 시간이 긴 검색의 실행 계획을 확인하고 검색 조건에 필요한 인덱스를 구성할 수 있습니다.

1. 데이터가 많아지면 검색이 느려지는 이유

색인 없이 모든 책을 확인하는 방식과 색인을 사용해 원하는 책을 바로 찾는 방식 비교
  • 코드를 바꾸지 않았는데 데이터가 많아지면서 검색이 느려지는 경우가 있어요.

    • 개발할 때는 데이터가 몇백 개밖에 없어서 검색이 바로바로 됐을 거예요.

    • 그런데 실제 서비스에서는 데이터가 계속 늘어나니까 똑같은 검색을 해도 2~3초씩 오래 걸리게 됩니다.

  • 이렇게 검색이 느려지는 가장 큰 이유는 데이터베이스가 확인해야 할 데이터가 너무 많아졌기 때문이에요.

    • 마치 책에서 특정 단어를 찾을 때 목차나 색인 없이 첫 페이지부터 끝까지 다 읽어보는 것과 같습니다.

      • 이걸 전체 스캔(Full Table Scan)이라고 부르는데, 데이터베이스가 모든 데이터를 하나하나 확인하는 방식이에요.

2. 검색 속도를 빠르게 하는 비법: 인덱스

  • 검색이 느려지는 문제를 해결하려면 인덱스(색인)를 잘 만들어야 해요.

    • 인덱스는 책의 ‘찾아보기’나 ‘목차’ 같은 것이라고 생각하면 됩니다.

      • 책에서 특정 단어를 찾을 때 찾아보기를 먼저 보면 본문을 처음부터 다 넘겨볼 필요가 없어요.

      • 데이터베이스의 인덱스도 똑같습니다. 검색 기준과 데이터의 위치를 미리 정리해 두어 필요한 데이터만 빠르게 찾을 수 있게 해줘요.

  • 그런데 개발 환경에서는 인덱스가 없어도 검색이 빨랐던 이유가 있어요.

    • 데이터가 너무 적으면 데이터베이스가 인덱스를 읽는 시간보다 전체를 다 훑어보는 게 더 빠르다고 판단하기도 합니다.

      • 그래서 실제 서비스처럼 데이터가 많을 때 인덱스가 제대로 작동하는지 꼭 확인해야 해요.

3. 검색이 느린 진짜 원인 찾기

전체 검색 대기 시간을 임베딩 변환, API 전달, DB SQL 실행, 화면 표시로 나눈 흐름
  • 검색창에서 검색 버튼을 눌렀을 때 결과가 나오기까지 걸리는 시간은 여러 단계의 합이에요.

    • 전체 검색 대기 시간은 다음 네 가지 시간을 모두 합한 값입니다.

      • 임베딩 변환 시간: 검색어를 컴퓨터가 이해하는 형태로 바꾸는 시간

      • API 네트워크 전달 시간: 검색 요청이 서버로 오가는 시간

      • DB SQL 실행 시간: 데이터베이스가 실제로 데이터를 찾는 시간

      • UI 화면 표시 시간: 찾은 데이터를 화면에 보여주는 시간

  • 인덱스를 개선하면 오직 ‘③ DB SQL 실행 시간’만 빨라질 수 있어요.

    • 만약 검색이 느린 이유가 ①이나 ② 때문이라면 인덱스를 아무리 많이 만들어도 검색 속도는 빨라지지 않습니다.

      • 그래서 먼저 어떤 단계에서 시간이 오래 걸리는지 정확히 확인하는 게 중요해요.

4. 인덱스 점검 체크리스트

인덱스 점검 항목과 확인 내용 및 대응 방법을 정리한 표
  • 데이터베이스가 데이터를 찾는 시간이 오래 걸린다면 다음 질문들을 확인해 봐야 해요.

    • 느린 검색 조건: 어떤 검색어, 필터, 정렬 조건 때문에 느려지는지 알아야 합니다.

    • 전체 스캔 여부: 데이터베이스가 모든 데이터를 다 확인하고 있는지 확인해야 해요.

      • 전체 스캔을 하고 있다면 검색 조건에 맞는 인덱스가 있는지, 인덱스를 제대로 사용하고 있는지 봐야 합니다.

    • 인덱스 사용 여부: 인덱스를 만들었는데도 데이터베이스가 그걸 쓰지 않고 다른 방법을 사용하는 경우가 있어요.

      • 인덱스가 있어도 확인할 데이터가 전체의 20~30% 이상이면 인덱스 대신 전체 스캔이 더 빠르다고 판단할 수도 있습니다.

      • 그래서 인덱스가 ‘있는지’와 ‘실제로 쓰고 있는지’는 꼭 따로 확인해야 해요.

    • 정렬 및 반환 건수: 데이터를 정렬하거나 특정 개수만 가져올 때 불필요하게 많은 데이터를 읽는 것은 아닌지 확인해야 합니다.

5. 검색 종류에 따른 인덱스 활용법

  • 검색하는 방식에 따라 가장 적합한 인덱스 종류가 달라요.

    • 정확한 데이터 찾기: 제품 코드, 회원 ID처럼 정확히 일치하는 데이터를 찾을 때는 B-Tree라는 인덱스가 적합합니다.

      • 이 인덱스는 사전처럼 단어를 순서대로 정리해 빠르게 찾을 수 있게 해줘요.

    • 키워드·단어 검색: 상품 이름이나 문서 내용에서 특정 단어를 찾을 때는 GIN이라는 인덱스가 적합합니다.

      • 이 인덱스는 책의 ‘찾아보기’처럼 어떤 단어가 어느 문서에 있는지 알려주는 방식이에요.

    • 의미 검색: “이런 내용과 비슷한 문서를 찾아줘”처럼 의미가 비슷한 대상을 찾을 때는 HNSW나 IVF 같은 인덱스가 적합합니다.

      • 단어의 의미를 숫자로 바꾸고 서로 얼마나 비슷한지 계산해 찾는 방식이에요.

      • 이런 인덱스가 없으면 컴퓨터가 모든 문서의 의미를 하나하나 비교해야 해서 검색이 크게 느려집니다.

6. 인덱스를 너무 많이 만들면 생기는 문제

한 권의 책이 바뀔 때 여러 색인을 모두 수정해야 하는 상황
  • 검색이 느리다고 해서 모든 데이터에 인덱스를 마구잡이로 만들면 안 돼요.

    • 저장 공간 증가: 인덱스도 데이터라서 저장 공간을 차지합니다.

    • 데이터 변경 지연: 데이터가 추가되거나 수정되거나 삭제될 때마다 데이터베이스는 관련된 모든 인덱스를 다시 정리해야 해요.

      • 그래서 인덱스가 너무 많으면 오히려 데이터를 저장하거나 수정하는 속도가 느려질 수 있습니다.

  • 꼭 필요한 검색에만, 그리고 데이터베이스가 느리다고 확인된 부분에만 인덱스를 생성하는 게 중요해요.

7. UQA로 필요한 인덱스만 구성해 검색 속도 높이기

  • 보통은 여러 종류의 데이터베이스를 따로 사용해 검색을 최적화해야 했어요.

    • 예를 들어 일반 데이터는 RDBMS, 단어 검색은 Elasticsearch, 의미 검색은 벡터DB를 각각 관리하는 방식입니다.

      • 이렇게 하면 느린 검색을 고치려고 할 때 각 데이터베이스의 설정과 기록을 일일이 확인해야 해서 복잡하고 어려워요.

  • UQA는 이런 복잡함을 줄여줘요.

    • 원본 데이터, 텍스트, 의미를 나타내는 숫자 등 여러 데이터를 UQA에서 함께 관리할 수 있습니다.

      • 단어 검색용 인덱스인 GIN과 의미 검색용 인덱스인 HNSW·IVF를 같은 테이블에서 만들고 관리할 수 있어요.

      • 그래서 검색이 느려지는 원인을 한곳에서 파악하고 해결할 수 있게 도와줍니다.

  • UQA를 사용하면 데이터가 많아졌을 때도 검색 속도를 점검하고 필요한 인덱스를 관리하기 쉬워져요.

UQA와 LLM 스킬을 활용하면 느린 검색 쿼리부터 인덱스 재구성, 전후 성능 검증까지 단계별로 요청할 수 있습니다.

# UQA 및 LLM 스킬 설치
curl -fsSL https://releases.uqa-cloud.cognica.io/install.sh | sh &&
export PATH="${UQA_INSTALL_DIR:-$HOME/.local/bin}:$PATH" &&
uqa llm install skills

1단계: 현재 느린 검색 쿼리 및 실행 계획 진단

제공한 검색 로그와 프로젝트 코드를 바탕으로 응답 시간이 긴 검색을 점검해 줘. [점검 항목] 1. 검색창 입력이 API와 DB까지 전달되는 파일 및 함수 경로 2. 전체 대기 시간, 임베딩 변환 시간, SQL 실행 시간, UI 표시 시간의 구간별 레이턴시 분리 3. 실제 실행되는 SQL, 검색어, 필터, 정렬 조건, 반환 건수(LIMIT) 4. 동일 검색 재현 시 DB 실행 시간 및 실행 계획(EXPLAIN) 분석 5. 전체 스캔(Full Scan)이 발생하는 구간과 실제 사용 중인 인덱스 6. 인덱스가 없거나 기존 인덱스를 사용하지 못하는 원인 분석 파일명, 함수명, SQL, EXPLAIN 결과를 근거로 정리하고 아직 코드는 수정하지 마세요.

2단계: 필요한 UQA 인덱스 구성

앞서 진단한 점검 결과를 바탕으로 응답 시간이 긴 검색에 필요한 인덱스만 정밀 구성해 줘. - 검색 조건을 '정확한 값 조회', '단어 검색', '의미 검색'으로 분류 - UQA에서 지원하는 인덱스(B-Tree, GIN, HNSW/IVF) 중 최적의 인덱스 선택 - 인덱스 대상 데이터 컬럼과 검색 SQL을 함께 최적화 - 데이터 추가·수정·삭제 시 인덱스가 정상적으로 갱신되는지 확인 - 선택한 인덱스 기준과 변경된 파일·SQL 내역 정리

3단계: 인덱스 변경 전후 성능 검증

인덱스 변경 전후를 동일 데이터, 동일 검색어로 실행하여 비교해 줘. [테스트 대상] - 제품 코드 검색 - 문서 단어 검색 - 자연어 의미 검색 [표로 정리할 항목] 1. 구간별 대기 시간: 전체 대기, 임베딩 변환, SQL 실행, 화면 표시 2. 실행 계획(EXPLAIN)에서 확인된 인덱스 이름 3. DB가 확인한 행 수와 최종 반환한 행 수 4. 상위 반환 결과 5개의 데이터 일치 여부 SQL 실행 시간이 줄어들지 않았다면 실행 계획을 다시 점검해 줘. SQL 실행 시간은 줄었지만 전체 대기 시간이 길다면 임베딩 변환이나 API 전달 구간의 병목을 진단해 줘.