피드로 돌아가기
원문 읽기
LINE Engineering
Database슬로우 쿼리 해결기: 함수형 인덱스로 비트 연산 쿼리 최적화하기
LINE VOOM이 MySQL 함수형 인덱스를 적용하고 비트 연산 쿼리 조건을 변경해 헤비 유저 프로필 조회 시 30초 이상 타임아웃 문제 해결
AI 요약
Context
LINE VOOM 포스트 서비스에서 수십만 건의 포스트를 보유한 헤비 유저의 소셜 프로필 조회 시 쿼리가 30초 이상 실행되다가 타임아웃이 발생했다. 문제 쿼리는 user_id와 category_flag & 0x0100, access_flag & 0x0001 조건으로 필터링하는 SELECT 문이었으며, 실행 계획 분석 결과 수십만 건의 행을 스캔하고 있었다.
Technical Solution
- MySQL 8.0.13의 함수형 인덱스(functional index)를 도입해 비트 연산 조건에 인덱스 적용
- category_flag & 0x0100과 access_flag & 0x0001 조건을 인덱싱 대상으로 지정해 스캔 대상 행 수 감소
- 쿼리 조건을 함수형 인덱스와 매칭되도록 변경해 옵티마이저가 인덱스를 활용하도록 유도
- 7개월에 걸친 문제 분석, 해결책 탐색, 운영 환경 적용 과정 진행
Impact
아티클에서 구체적인 성능 수치(응답 시간 감소, 쿼리 실행 시간 개선율 등)는 명시되지 않음.
Key Takeaway
bit 타입의 비트 플래그 컬럼에 대한 비트 연산(&) 조건으로 인한 슬로우 쿼리는 MySQL 함수형 인덱스를 활용해 해결할 수 있으며, 이러한 경우 쿼리 조건이 인덱스와 정확히 매칭되도록 작성해야 옵티마이저가 인덱스를 활용한다.
실천 포인트
MySQL 8.0.13 이상을 사용하는 서비스에서 bit 타입 컬럼의 비트 연산(&) 조건으로 인한 풀 테이블 스캔 문제가 발생할 때, 함수형 인덱스를 CREATE INDEX idx_name ON table_name((column & bitmask)) 형식으로 생성하고 쿼리 조건을 함수형 인덱스와 동일하게 유지하면 인덱스 활용을 통한 쿼리 성능 개선을 기대할 수 있다.