안녕하세요 푸드 테크팀 백엔드 개발자 박형민입니다.
오늘은 페이지네이션의 성능을 개선 시키는 방법 중 하나인 no-offset 페이지네이션에 대해 기록을 남겨보고자 합니다!
no offset 페이지네이션이란, 말 그대로 offset 을 사용하지 않고 페이지네이션을 진행한다는 말입니다.
일반적인 페이지네이션은, limit과 offset 명령어를 이용하면, offset(어디부터) limit(몆개의) 데이터를 불러올지 결정하고
이를 이용해, offset을 페이지 넘버로 활용을 합니다,
(offset = page size * page number)
ex) select * from tabale_name limit 20 offset 0;
no offset 페이지네이션을 사용하는 방법은 생각보다 간단합니다.
offset, 즉 페이지 넘버를 대신해서, 탐색을 해줄 위치로 이동시켜줄 무엇인가만 있으면 됩니다.
sql에서는 우리가 흔하게 사용하는 where indxe = ? 라는 조건문을 통해 쉽게 특정 위치를 지정할 수 있습니다.
아주 간단하게 이렇게 사용할 수 있는것이죠
ex) select * from tabale_name where idx > 0 limit 20;
사실 우리가 페이지네이션 기능의 성능을 개선시키고자 하는 큰 이유는, 가장 기본적인 off-set 기반 페이지네이션이 full Scan 방식을 띈다는 것입니다.
offset 페이지네이션의 성능은, 해당 페이지 수 까지, 쭈----욱 탐색하고 필요한 데이터를 불러오기 때문에 페이수가 늘어날수록 성능이 저하됩니다.
이번에는 no-offset 페이지네이션을 사용해 보겠습니다.
첫 페이지 조회
마지막 페이지 조회
📌 앞의 offset 과 단순 조회 시간만 비교한다면, 60,543배의 속도차이가 발생합니다.
위의 예시와, 실제 실행계획을 보면 알 수 있듯이, where 조건절을 타고 들어가는 건, index가 걸려있어야합니다.
그래야만 index range scan으로 조회가 되기 때문에, 유의미한 결과를 낼 수 있습니다.
📌따라서 다음과 같은 조건들이 붙습니다.
1. 정렬된, 인덱스 값이 있어야한다.
2. 인덱스 key 값에 중복이 있으면 안된다. (데이터가 누락될 수 있음)
3. 페이징 버튼(1,2,3) 을 사용하는 경우, 사용이 어렵다
📌 이런 조건들로 보았을 때 No-Offset 은
정렬되고 중복이존재하지않는 인덱스값을 가지는, 무한 스크롤 방식에 유용하다고, 생각됩니다.
단, No-Offset 방식은, 그저 하나의 방법일 뿐, 모든 것은 요구사항과 주어진 상황에 따라 달라진다고 생각됩니다
감사합니다!!
no offset 을 사용하기 위해 고려해야 할 제약조건을 설명해주셔서 좋았습니다!