게시판 페이지 처리 문제

조회수 2036회

안녕하세요.

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

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

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

SELECT count(*) FROM articles;

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

Pagination 은

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

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

이전 201 202 203 다음

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

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

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

1 답변

  • 좋아요

    5

    싫어요
    채택 취소하기

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

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

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

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

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

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

    구글 페이지네이션

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 그렇다면 만약에 구글 페이지가 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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)