2011-05-09 6 views
0

나는 각각 15k 개의 이미지 축소판을 몇 백 가지 가지고 있습니다. 나는 각 페이지에 20 정도를 표시하고 싶다.큰 이미지 축소판의 Django 페이지 매기기

django.core.paginator 페이지의 페이지 매김에 충분합니까? 즉, 현재 페이지에 표시된 이미지 만 반환합니까? (그렇지 않다면 어떻게해야 좋은가요?) 감사합니다.

답변

1

RDBMS에서 한 가지 큰 한계가 있기 때문에 (MySQL, Postgres 등 모든 데이터베이스에 영향을 미침) 의존적입니다.

django.core.paginator은 모든 종류의 SQL 쿼리를 나타내며 LIMIT 절을 추가하여 데이터베이스에서 몇 개의 항목을 얻습니다. 이 방법은 많은 종류의 응용 프로그램에서 잘 작동하지만 항목이 많으면 심각한 문제가 될 수 있습니다. 특히 문제는 800 번째 페이지에 액세스 할 때마다 데이터베이스가 실제로 801 * 20 개 항목을 가져온 다음 첫 번째 800 * 20 개 항목을 다시 드롭하여 마지막 20 개 항목을 반환한다는 것입니다.

불행히도이 문제를 해결하기위한 쉬운 방법은 없습니다. 많은 경우, 다음/prev 버튼으로 충분할 수 있으므로 페이지 번호 대신 애프터 키로 작동하는 페이지 매김을 작성할 수 있습니다. 예를 들어 사용자가 현재 표시 한 마지막 항목에 "D" 키가있는 경우 /next?after=D에 연결된 다음 단추를 표시 한 다음 SELECT * FROM objects WHERE key > D ORDER BY key LIMIT 20과 같은 SQL 쿼리를 사용합니다. 이 방법의 장점은 objects.key에 색인을 추가하여 작업 속도를 크게 높일 수 있다는 것입니다.

또 다른 접근법은 인덱스 된 추가 (!) 열 page_num을 테이블에 추가해야한다는 것입니다. 그런 다음 SELECT * FROM objects WHERE page_num=800 ORDER BY key과 같은 SQL 쿼리를 수행 할 수 있습니다. 이 방법을 사용하면 모든 페이지를 무작위로 액세스 할 수 있지만 page_num 열을 유지해야합니다. 데이터가 끝 부분에 주로 추가되는 경우 쉽고 중간에 요소를 효율적으로 삭제/삽입하려는 경우 더 복잡합니다.

코드 줄이 약 1 줄이므로 django.core.paginator부터 시작하겠습니다. 그러나 페이지 매김 된 뷰의 응답 시간과 데이터베이스의 느린 쿼리 로그를 주시하십시오. 데이터베이스 서버가 더 이상로드를 처리 할 수없는 경우 위에서 언급 한 기술 중 하나를 선택해야합니다. 임의 페이지 액세스가 요구 사항 일 경우 솔루션 2를 선택하고 그렇지 않은 경우 솔루션 1을 선택하십시오 (훨씬 간단하기 때문에).

추신 : 그렇습니다. django.core.paginator이 올바르게 작동합니다. :)