LIMIT이란?
MySQL의 limit 절은 가져올 행(row)의 개수를 지정하는 절입니다.
기본적으로 다음과 같이 사용됩니다.
# 데이터를 5건만 조회
SELECT * FROM 테이블명
LIMIT 5;
OFFSET이란?
MySQL의 offset 절은 건너뛸 행(row)의 개수를 지정하는 절입니다.
기본적으로 다음과 같이 사용됩니다.
# 0개의 행을 건너뛰고 5건 조회
# offset 사용
SELECT * FROM 테이블명
LIMIT 5 OFFSET 0;
# offset 생략
SELECT * FROM 테이블명
LIMIT 5, 0;
LIMIT과 OFFSET으로 페이징 구현하기
예제에 사용될 테이블과 데이터입니다.
# 테이블 생성
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
# 생성한 테이블에 데이터 등록
INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
('Charlie', 'charlie@example.com'),
('David', 'david@example.com'),
('Eve', 'eve@example.com'),
('Frank', 'frank@example.com'),
('Grace', 'grace@example.com'),
('Hank', 'hank@example.com'),
('Ivy', 'ivy@example.com'),
('Jack', 'jack@example.com');
위 예제 데이터에서 한 페이지 당 5건을 가져온다고 할 때, 1페이지를 가져오는 쿼리입니다.
SELECT * FROM users
ORDER BY id
LIMIT 5 OFFSET 0;
limit 5 offset 0은 0개의 행을 건너 뛴 데이터 중 5개를 반환한다는 의미입니다.
만약 2페이지를 조회한다고 하면 다음과 같이 사용하면 됩니다.
SELECT * FROM users
ORDER BY id
LIMIT 5 OFFSET 5;
offset 5에 의해 5개의 행을 건너뛰고 5건을 조회하는 쿼리입니다.
따라서 페이징을 구현하기 위해서는 다음과 같은 규칙으로 쿼리를 실행하면 됩니다.
# page_size = 한 페이지 당 데이터 개수
# page = 페이지 번호
# 페이지 번호가 0부터 시작하는 경우
limit ${page_size} offset ${page} * ${page_size}
# 페이지 번호가 1부터 시작하는 경우
limit ${page_size} offset (${page} - 1) * ${page_size}
OFFSET 절의 경우, 큰 offset 값이 들어올 때 offset에 해당하는 행을 무시하면서 계속 읽어야하기 때문에 성능 문제가 생길 수 있습니다.
그래서 페이징 기능을 구현할 때 뒷 데이터를 조회하는 경우가 많다면 성능 개선에 대해 고민이 필요할 수 있습니다.