백엔드 검색 쿼리 최적화 부분에 대해 발표할 김현지 입니다.
문제 상황을 먼저 말씀드리자면, sql 쿼리 성능에 대해 측정해보고자 100만개의 더미데이터를 넣고 진행을 해보게 되었고, 검색 시 DB 내 데이터가 많은 경우, 검색 시 시간이 timeout에 의해 오류로 반환될 정도로 성능이 좋지 못함을 확인했습니다. 또한 검색 시에 연관도가 더 낮은 데이터가 위에 올라오는 등 사용자 측면에서도 개선하면 좋겠다 싶은 부분이 있었습니다.
이를 개선하는 과정에서 학습한 cs 지식은 크게
In Natural Language Mode/In Boolean Mode의 차이
SQL Like 연산
Cursor 기반 페이지네이션입니다.
In Natural Language Mode는 ngram 등과 같은 기능을 통해 string을 토큰화하고, 토큰화 한 단어 중 하나라도 포함되는 데이터를 탐색합니다. Relevance value를 통해 관련도를 파악할 수 있습니다.
대량의 텍스트 데이터에서 유의미한 검색 결과를 추출하는 데 초점을 맞춘 검색 방식입니다.
In Boolean Mode는 스탑워드 및 짧은 단어 처리/논리적 연산 지원 등 검색 조건을 사용자 지정할 수 있습니다. 또한 복잡한 연산이 진행되기에 속도 측면에서 성능이 크게 좋지 못할 수 있습니다.
SQL Like 연산은 앞서 말했던 두 가지 탐색에 비해 가벼운 탐색 연산을 진행하며, string의 앞에서부터 탐색하기 때문에 %word% 처럼 앞에 % 연산자를 붙이면 인덱스 적용을 하더라도 성능 저하가 있을 수 있습니다.
Cursor 기반 페이지네이션은 client가 cursor 데이터와 함께 api를 요청하도록 하고,
요청에 포함된 cursor 데이터를 활용하여 where문을 사용해 탐색해야 할 데이터를 감소시켜 성능에서 개선을 보입니다.
또한 개선 과정에서 조사가 필요하여 skip/limit 연산도 조사했는데요. 모든 데이터를 탐색하고 정렬한 이후 사용되는 연산이기 때문에 건너 뛸 모든 데이터도 순회하게 됩니다. 따라서 해당 연산은 pagination에서 큰 성능 개선을 보이지 못할 수 있습니다.
개선 작업 내용을 간단히 설명드리겠습니다.
테스트 환경은 mysql과 postman을 사용했구요. 100만 20건의 feed 더미 데이터를 사용하여 테스트를 진행했습니다.