MySQL에서 Offset이 커질수록 쿼리가 느려지는 이유

Gongmeda·2023년 1월 1일
1
post-thumbnail

현상

MySQL에서 주로 페이징 처리를 위해 LIMIT 쿼리를 사용합니다

이때, 특정 페이지의 데이터를 가져오기 위해 Offset 값을 주어 LIMIT 50000, 20 와 같은 쿼리를 사용하는데요

이때 앞의 값인 Offset이 커질수록 쿼리의 처리 속도는 점점 느려집니다

원인

이러한 현상의 원인은 MySQL이 Offset을 처리하는 방식에 있습니다

LIMIT 50000, 20 쿼리는 언뜻 생각하면 50000번째 record로 이동하여 20개의 row를 가져오면 될 것도 같지만 불가능합니다

이유는 다음과 같습니다

  1. 조건에 맞는 record가 모두 연속적으로 존재한다는 보장이 없음
  2. 삭제된 record로 인해 갭이 존재할 수 있음

따라서 MySQL은 Offset 쿼리를 처리하기 위해 Offset + LIMIT 개수 만큼의 record를 읽은 후 마지막 LIMIT 개수만큼 취하고 나머지를 버리는 식의 처리를 하게 됩니다

즉, LIMIT 50000, 20 쿼리에서는 50020개의 record를 읽은 후, 앞의 50000개의 record를 버리고 마지막 20개를 반환하게 되는 것 입니다

참고

profile
백엔드 깎는 장인

0개의 댓글