Ethan Hur's blog

Mysql Pagination 실수

2017-07-04

Web 에서 Mysql 을 쓰다 보면 데이터를 Pagination 해야할 때가 있다.

그럴 때 UNIQUE 하지 않은 데이터를 기준으로 정렬해야 할 때 주의할 점을 소개한다.

1
2
3
4
5
6
create table snippet(id INT, val INT);
insert into snippet values(1,1);
insert into snippet values(2,1);
insert into snippet values(10,1);
insert into snippet values(3,1);

위와 같이 데이터를 넣고 (물론 KEY 는 id 이다)

1
2
3
4
5
6
7
8
9
select * from snippet order by val limit 0, 2;
-> (3, 1)
(2, 1)
select * from snippet order by val limit 2, 2;
-> (10, 1)
(3, 1)

이런 식으로 나오는 결과가 있다. 이러한 이유는 ORDER BY 로 뽑아내는 값이 DB의 데이터 저장 환경에 따라 달라질 수 있기 때문이다.

그래서 UNIQUE 한 순서로 나오도록 정렬해야 한다. 다음과 같은 방법을 추천한다.

1
2
3
select * from snippet order by val, id limit 0, 2;
select * from snippet order by val, id limit 2, 2;

위와 같은 방법으로 UNIQUE 한 결과를 얻을 수 있어 Pagination 시 버그가 생기지 않는다.

물론 아무도 이런 식으로 Production 제품을 코딩하진 않았을 것으로 믿는다.

찾아보니 비슷한 질문을 한 사람도 있더라 ㅋㅋㅋ