SQL로 쿼리할 때 내 사이트의 페이지를 매기는 가장 효율적인 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/52723

  •  09-06-2019
  •  | 
  •  

문제

웹 페이지에서 사용하기 위해 SQL 쿼리 결과의 페이지를 매기려고 합니다.언어와 데이터베이스 백엔드는 PHP와 SQLite입니다.

내가 사용하는 코드는 다음과 같이 작동합니다(페이지 번호 매기기는 0부터 시작).

http://example.com/table?page=0

page = request(page)
per = 10 // results per page
offset = page * per

// take one extra record so we know if a next link is needed
resultset = query(select columns from table where conditions limit offset, per + 1)

if(page > 0) show a previous link
if(count(resultset) > per) show a next link

unset(resultset[per])

display results

이보다 페이지 매김을 수행하는 더 효율적인 방법이 있습니까?

현재 방법에서 볼 수 있는 한 가지 문제는 결과를 표시하기 전에 10개(또는 그 이상)의 결과를 모두 메모리에 저장해야 한다는 것입니다.PDO가 행 개수를 사용할 수 있다고 보장하지 않기 때문에 이렇게 합니다.

발행하는 것이 더 효율적일까요? COUNT(*) 존재하는 행 수를 알아보기 위한 쿼리를 수행한 다음 결과를 브라우저로 스트리밍하시겠습니까?

이것은 "테이블의 크기에 따라 다릅니다. count(*) 쿼리에는 데이터베이스 백엔드에서 전체 테이블 스캔이 필요합니다.", "직접 프로파일링을 수행하십시오"와 같은 질문이 있습니까?

도움이 되었습니까?

해결책

먼저 계산을 해보는 것이 좋습니다.count(기본 키)는 매우 효율적인 쿼리입니다.

다른 팁

나는 COUNT(*) 두 개의 쿼리 방법을 선택했습니다. 왜냐하면 다른 방법에서는 허용되지 않는 마지막 페이지에 대한 링크를 직접 만들 수 있기 때문입니다.카운트를 먼저 수행하면 결과를 스트리밍할 수 있으므로 더 적은 메모리로 더 많은 수의 레코드를 처리할 때 잘 작동합니다.

페이지 간의 일관성은 나에게 문제가 되지 않습니다.도움을 주셔서 감사합니다.

페이지를 매겨야 하는 수천 개의 행을 반환하는 상당히 복잡한(9-12 테이블 조인) 쿼리가 있는 경우가 몇 가지 있습니다.분명히 페이지를 멋지게 매기려면 결과의 전체 크기를 알아야 합니다.MySQL 데이터베이스의 경우 SELECT에서 SQL_CALC_FOUND_ROWS 지시문을 사용하면 이를 쉽게 달성하는 데 도움이 될 수 있지만, 이것이 더 효율적인지 여부는 판단할 수 없습니다.

그러나 SQLite를 사용하고 있으므로 2 쿼리 접근 방식을 고수하는 것이 좋습니다. 여기 이 문제에 대한 매우 간결한 내용입니다.

백엔드가 10개의 행을 반환할 때까지 사용자가 기다리는 것이 문제가 될지는 의문입니다.(이미지 크기를 잘 지정하고, 가능한 경우 웹서버가 압축된 데이터 전송을 협상하도록 하는 등의 방법으로 이를 보완할 수 있습니다.)

나는 처음에 count(*)를 수행하는 것이 별로 유용하지 않을 것이라고 생각합니다.

복잡한 코딩을 수행하는 경우:사용자가 페이지 x를 볼 때 향상된 사용자 경험을 위해 ajax와 같은 마법을 사용하여 페이지 x+1을 미리 로드합니다.

페이지 매기기에 대한 일반적인 참고 사항:사용자가 페이지를 탐색하는 동안 데이터가 변경되면 5월 솔루션이 매우 높은 수준의 일관성을 요구한다면 문제가 될 수 있습니다.나는 그것에 대해 메모를 썼다 다른 곳에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top