게시판 페이지 처리 문제


안녕하세요.

게시판 페이지 처리에 대해 질문이 있어서 올리게 되었습니다.

웹에서 pagination 을 구현할때 페이지 자체의 크기를 알기 위해서는

게시글의 총 갯수가 필요하지 않나요?

SELECT count(*) FROM articles;

count 쿼리를 사용하면 현재 게시글이 20만개 정도 되는 테이블에서 1초가 넘게걸립니다.

Pagination 은

이전 1 2 3 4 5 6 7 8 9 10 다음

이런식으로 구현되있는 상태고 페이지 크기를 받아서 마지막 페이지는

이전 201 202 203 다음

이런식으로 마지막 페이지를 마무리 하고 싶습니다.

전체 count 를 사용하지 않고 페이지 개수를 구하는 다른 방법이 있을까요?

보통 어떤방식으로 구현하는지 알고싶습니다!

  • 2016년 05월 02일에 작성됨

조회수 285


1 답변


좋아요
5
싫어요
채택취소하기

근본적으로 전체 로우 수를 모르면 정확하게 페이지 수를 계산할 수 없습니다.

전체 로우 수를 계산하는 것은 매우 큰 연산이기 때문에 보통 전체 페이지 수를 노출하지 않습니다.

대안으로 아래처럼 offset, limit 으로 정렬된 데이터의 커서를 활용해서 스캔하는 방식을 사용합니다.

아래 쿼리가 1 페이지라면 2 페이지는 LIMIT 11, 10이 될 것입니다.

SELECT * FROM table ORDER BY id DESC LIMIT 0, 10;

첨부는 구글에서 사용하고 있는 페이지네이션 모습입니다. 전체 카운트가 없죠?

구글 페이지네이션

  • 2016년 05월 02일에 작성됨
    프로그래밍 언어를 좋아하는 프로그래머

  • 그렇다면 만약에 구글 페이지가 203페이지에서 끝난다면     김진혁   2016.5.2 22:13     
  • 이전 201 202 203 다음 이런식으로 203에서 끊을 수는 없는건가요?     김진혁   2016.5.2 22:14     
  • 위 방법의 경우 경우에 offset, limit으로 가져온 데이터가 10개 이하라면 이번 페이지가 끝이라는 것은 알 수는 있겠지만 미리 그려 놓은 페이징 링크에 대해서는 이벤트가 일어나기 전에는 유효한 링크인지 알 수 없습니다. 구글에서 `네이버` 같은 키워드로 검색 후에 하단 페이징 링크를 하나씩 눌러보시면 트릭을 발견하실 수 있을겁니다. 페이징의 경우 대부분의 뷰가 데이터 앞쪽에서 이루어 지기 때문에 어느정도 데이터가 쌓이게 되면 뒤쪽은 상대적으로 신경을 덜 쓰셔도 괜찮습니다.    정대원   2016.5.2 23:16     
  • 아 그렇군요..! 답변 감사드립니다~!    김진혁   2016.5.3 18:37     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close