Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL LIMIT과 OFFSET으로 페이지네이션 구현하기

웹 애플리케이션에서 대량의 데이터를 한 번에 모두 조회하는 것은 비효율적입니다. 이럴 때 페이지네이션(Pagination)을 활용하면 데이터를 원하는 만큼 나누어 조회할 수 있습니다. MySQL에서는 LIMITOFFSET을 사용해 손쉽게 페이지네이션을 구현할 수 있습니다.

이 글에서는 실제 테이블을 생성하고 데이터를 삽입한 뒤, LIMIT과 OFFSET을 활용해 페이지네이션을 적용하는 과정을 단계별로 살펴보겠습니다.

1단계: 테이블 생성

먼저 CREATE 명령어를 사용해 테이블을 생성합니다. 쿼리는 다음과 같습니다.

mysql> CREATE table limitoffsetDemo
-> (
-> id int,
-> FisrtName varchar(200)
-> );
Query OK, 0 rows affected (0.45 sec)

테이블이 정상적으로 생성되었습니다. 다음으로 샘플 데이터를 삽입하겠습니다.

2단계: 레코드 삽입

INSERT 명령어를 사용하여 테이블에 레코드를 추가합니다.

mysql> INSERT into limitoffsetDemo values(1,'John');
Query OK, 1 row affected (0.11 sec)

mysql> INSERT into limitoffsetDemo values(2,'Bob');
Query OK, 1 row affected (0.16 sec)

mysql> INSERT into limitoffsetDemo values(3,'David');
Query OK, 1 row affected (0.13 sec)

mysql> INSERT into limitoffsetDemo values(4,'carol');
Query OK, 1 row affected (0.19 sec)

mysql> INSERT into limitoffsetDemo values(5,'Taylor');
Query OK, 1 row affected (0.10 sec)

mysql> INSERT into limitoffsetDemo values(6,'John');
Query OK, 1 row affected (0.24 sec)

mysql> INSERT into limitoffsetDemo values(7,'Smith');
Query OK, 1 row affected (0.13 sec)

mysql> INSERT into limitoffsetDemo values(8,'John');
Query OK, 1 row affected (0.12 sec)

mysql> INSERT into limitoffsetDemo values(9,'Johnson');
Query OK, 1 row affected (0.11 sec)

mysql> INSERT into limitoffsetDemo values(10,'Jason');
Query OK, 1 row affected (0.08 sec)

mysql> INSERT into limitoffsetDemo values(11,'Bk');
Query OK, 1 row affected (0.17 sec)

3단계: 저장된 데이터 확인

레코드 삽입이 완료되면 SELECT 명령어로 테이블에 저장된 전체 데이터를 확인할 수 있습니다.

mysql> SELECT * from limitoffsetDemo;

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+------+-----------+
| id | FisrtName |
+------+-----------+
| 1 | John |
| 2 | Bob |
| 3 | David |
| 4 | carol |
| 5 | Taylor |
| 6 | John |
| 7 | Smith |
| 8 | John |
| 9 | Johnson |
| 10 | Jason |
| 11 | Bk |
+------+-----------+
11 rows in set (0.00 sec)

현재 테이블에는 총 11개의 레코드가 저장되어 있습니다.

4단계: LIMIT과 OFFSET으로 페이지네이션 적용

이제 LIMIT과 OFFSET을 활용해 페이지네이션을 구현해 보겠습니다. 기본 문법은 다음과 같습니다.

SELECT * from yourTableName limit value1,value2;

여기서 각 값의 의미는 다음과 같습니다.

  • value1(OFFSET): 몇 번째 레코드부터 출력할지 지정합니다. 즉, value1개의 레코드를 건너뜁니다.
  • value2(LIMIT): 건너뛴 위치부터 몇 개의 레코드를 가져올지 그 개수를 지정합니다.

예를 들어, 7번째 레코드를 건너뛰고 그다음 4개의 레코드만 조회하고 싶다면 아래와 같이 쿼리를 작성합니다.

mysql> SELECT * from limitoffsetDemo limit 7,4;

실행 결과는 다음과 같습니다.

+------+-----------+
| id | FirstName |
+------+-----------+
| 8 | John |
| 9 | Johnson |
| 10 | Jason |
| 11 | Bk |
+------+-----------+
4 rows in set (0.00 sec)

앞의 7개 레코드(id 1~7)가 건너뛰어지고, 8번째 레코드부터 4개의 행만 반환된 것을 확인할 수 있습니다.

마무리

이처럼 MySQL의 LIMITOFFSET을 조합하면 간단하게 페이지네이션을 구현할 수 있습니다. 예를 들어 한 페이지당 10개씩 보여주고 싶다면 2페이지는 LIMIT 10, 10, 3페이지는 LIMIT 20, 10 형태로 응용하면 됩니다. 다만 데이터가 매우 큰 경우 OFFSET이 커질수록 성능이 저하될 수 있으므로, 필요에 따라 인덱스 최적화나 키셋 페이지네이션(Keyset Pagination) 방식도 함께 고려하는 것이 좋습니다.