FTS와 index 방식의 차이점

모두·2025년 3월 12일

오늘은 데이터베이스에서 빠르고 효율적인 검색을 수행하는 방법의 대표적인 FTS와 index에 대해서 알아보고 각 방식의 차이점과 특징에 대한 글을 작성하려고 해

  • 문서, 기사, 블로그 포스트 등의 대량의 텍스트 검색에 사용되는 방식
  • 단어의 일부분뿐 아니라 단어의 위치와 빈도를 고려해서 결과를 제공
  • 자연어 처리(NLP - Natural Language Processing)와 유사한 기능을 지원하여
    관련성이 가장 높은 결과를 반환

Full-Text Search 는 일반적인 index방식과 차이가 있고 title과 body를 지정하고 FULLTEXT 를 사용해 이 친구는 Full-Text 다 선언을 해줘야함

  • 그래야 검색 가능
  • 유사도 기반의 검색을 한다.

아래 쿼리문은 만약 조회를 할 때 'MySQL search' 라는 문구가 있으면 찾게 해달라라는 의미

완벽하게 똑같지 않아도 검색이 된다는 걸 확인하기 위해 row를 조금씩 다르게 해서 넣은 후

검색을 위에서 만들어 준 쿼리를 통해 해주면 2개가 유사도 기반으로 검색을 하여 잘나온다.

반면에 LIKE 를 사용하면 완벽히 일치하는 것만 나옴

  • 중간에 ... 있는 data는 조회 불가능

유사도 기반의 검색의 예시를 하나 보겠다

  • 예시) 구글 검색
    • 많이 검색했던 것들을 토대로 결과가 나옴

FTS(Full-Text Search) 장/단점

  • 장점

    • 고급 검색: 자연어를 지원하여 복잡한 검색이 가능
    • 연관 검색: 관련성이 높은 결과를 우선적으로 반환
  • 단점

    • 추가적인 저장 공간: index를 유지하기 위한 추가적인 저장 공간이 필요함
    • 복잡한 설정: index보다 설정이 복잡함

MySQL 에서 FTS 를 지원하지만 잘 사용하지 않는 이유는 한계가 있기도 하고, 형태소 분석을 해주지 않으면 원하는 방향으로 조회가 안될 가능성이 크다.

index

  • 숫자 데이터, 날짜, 그리고 텍스트 데이터에서의 정확한 일치 검색에 사용
  • 혹은 데이터를 빠르게 조회하고 정렬하는 데 사용
  • 특정 컬럼의 값을 기준으로 데이터의 위치를 빠르게 찾아줌(B-Tree)
  • 특정 컬럼에 index를 생성해서 해당 컬럼의 값을 정렬하여 빠르게 검색이 가능함
    • 특정 컬럼을 하나하나 지정해야 하는 문제 발생

텍스트가 아닌 다른 것들에 대해서도 검색 가능

  • 텍스트는 용량이 크기 때문에 index 를 잘 쓰지는 않고 FTS 를 사용하거나 별도의 검색엔진인 elasticsearch 많이 사용함
  • index 는 텍스트가 아닌 작은 사이즈의 data에 많이 씀

  • name 에 index 를 걸어서 미리 선언
  • 근데 index 를 미리 안해두어도 검색이 잘 된다고 하는 경우들이 있다.
    • 그게 MySQL 의 장점 (데이터가 있으면 빠르게는 아니어도 어떻게든 조회가 가능함)

index 장/단점

  • 장점

    • 빠른 검색: 특정 값에 대한 빠른 조회 가능
    • 다양한 데이터 타입: 숫자, 문자열, 날짜 등 다양한 데이터 타입에 대해서 index 생성 가능
  • 단점

    • 제한된 검색 기능: 부분 일치나 텍스트 내 검색 기능이 부족
    • 유지 보수 비용: 데이터 변경시 인덱스도 업데이트해야하므로 추가 비용 발생(cpu, memory 등)

index 를 사용하면 LIKE 문을 통해서만 검색을 하기에 유사도를 기반으로 한 텍스트 검색 기능 부족

index 를 지정해 두었다 이후에 index 를 추가하는 수정을 할려면 table 에 lock 이 걸려야 하는데 이때 조회 , 수정, 삭제 등 기능이 막히게 되는데 우리는 조회를 빠르게 할려고 잠깐 중단을 가져가는 상황이 발생한다.

정리 : FTS 가 index 기반으로 동작하지만 일반적으로 제공하는 index 와는 로직에 차이가 있다.

0개의 댓글