[데이터베이스] Pagination을 구현하는 SQL

Yoon Uk·2023년 8월 3일
0

데이터베이스

목록 보기
9/20
post-thumbnail

MySQL을 사용해 페이지네이션을 구현하는 방법을 간단히 설명해보겠습니다.

1. LIMIT과 OFFSET을 사용하는 방법

MySQL에서 페이지네이션을 구현하기 위해서는 LIMIT과 OFFSET이라는 키워드를 사용할 수 있습니다.
LIMIT은 가져올 레코드의 수를 지정하고, OFFSET은 시작점을 지정합니다.

예시

예를 들어, 10개의 레코드를 한 페이지로 보여주고 싶다면, 첫 번째 페이지의 쿼리는 다음과 같이 작성할 수 있습니다.

SELECT * 
FROM posts 
LIMIT 10 OFFSET 0;

이 쿼리는 posts 테이블에서 처음부터 10개의 레코드를 가져옵니다.

두 번째 페이지의 쿼리는 다음과 같이 작성할 수 있습니다.

SELECT * 
FROM posts 
LIMIT 10 OFFSET 10;

이 쿼리는 posts 테이블에서 11번째부터 20번째까지의 레코드를 가져옵니다.
이런 식으로 OFFSET을 증가시키면서 페이지네이션을 구현할 수 있습니다.

문제점

하지만 이 방법에는 한 가지 문제점이 있습니다. 바로 성능입니다. OFFSET을 사용하면 MySQL은 처음부터 해당 위치까지의 모든 레코드를 읽어야 합니다.

예를 들어, 1000번째 페이지를 보여주려면, MySQL은 처음부터 999번째까지의 레코드를 읽고 버려야 합니다. 이는 많은 시간과 자원을 낭비하는 일입니다.

또한 특정 페이지에서 다음 페이지로 이동하던 도중에 새로운 행(row)이 추가된다면 데이터가 중복 조회 되는 문제가 발생할 수 있습니다.

그렇다면 이 문제를 해결할 수 있는 방법은 없을까요?
다행히도, MySQL에서는 다른 방법으로 페이지네이션을 구현할 수 있습니다.

2. WHERE 절과 인덱스를 사용하는 방법

바로 WHERE 절과 인덱스를 사용하는 방법입니다.

WHERE 절인덱스를 사용하면, MySQL은 필요한 레코드만 읽어올 수 있습니다.

이 방법의 장점은 성능입니다. WHERE 절과 인덱스를 사용하면, MySQL은 인덱스를 통해 필요한 레코드만 읽어올 수 있기 때문에, 성능이 훨씬 좋아집니다.

단점은 쿼리가 복잡해진다는 것입니다. OFFSET을 사용하는 방법보다 쿼리가 길어지고, 조건을 잘못 작성하면 원하는 결과가 나오지 않을 수도 있습니다.

예시

예를 들어, id라는 컬럼에 인덱스가 걸려있다고 가정해봅시다. 그러면 첫 번째 페이지의 쿼리는 다음과 같이 작성할 수 있습니다.

SELECT * 
FROM posts 
WHERE id <= 10 
ORDER BY id DESC;

이 쿼리는 posts 테이블에서 id가 10 이하인 레코드를 내림차순으로 정렬하여 가져옵니다.

두 번째 페이지의 쿼리는 다음과 같이 작성할 수 있습니다.

SELECT * 
FROM posts 
WHERE id <= 20 AND id > 10 
ORDER BY id DESC;

이 쿼리는 posts 테이블에서 id가 20 이하이고 10 초과인 레코드를 내림차순으로 정렬하여 가져옵니다.

이런 식으로 WHERE 절에 조건을 추가하면서 페이지네이션을 구현할 수 있습니다.

마무리

결론적으로, 페이지네이션을 구현한다고 했을때 쿼리를 어떻게 작성해야할까요?

답은 상황에 따라 다릅니다.

OFFSET을 사용하는 방법은 쿼리가 간단하고 직관적이지만, 성능이 떨어질 수 있습니다.
WHERE 절과 인덱스를 사용하는 방법은 쿼리가 복잡하고 어려울 수 있지만, 성능이 좋아질 수 있습니다.
따라서, 페이지네이션을 구현할 때는 자신의 데이터와 요구사항에 맞는 방법을 선택하는 것이 중요합니다.

0개의 댓글