2014-06-07 6 views
0

GUID가 키 인 아래 테이블과 비슷한 테이블이 있습니다. GUID를 키로 사용하는 페이징을 사용하여 tis의 내용을 표시하려하지만 어떻게해야합니까?GUID 키를 사용하여 테이블의 데이터 페이지를 표시하는 방법

CREATE TABLE `planetgeni`.`PostComment` (
    `PostCommentId` CHAR(36) DEFAULT NULL, 
    `UserId` INT NOT NULL, 
    `CreatedAt` DATETIME NULL DEFAULT NULL , 
    . 
    . 
    . 
    PRIMARY KEY (`PostCommentId`) 
    ) 
ENGINE=InnoDB DEFAULT CHARSET=latin1; 

내 저장 프로 시저가 내림차순으로 나에게 다음 10 순서를 제공, 이와 같은 것일 것이다 지능 키가 있다면. 그러나 GUID를 사용하면 해당 유형의 페이징을 수행하는 방법을 알 수 없습니다.

getPostComment(int lastPostID) 
    where PostCommentId< lastPostID order by PostCommentId desc LIMIT 10; 
+0

해당 테이블에 게시 날짜/시간 필드가 있습니까? 나는 그것으로 명령 할 것이다. – James

+0

@James 나는 datetime 필드를 가지고 있지만 같은 날짜 시간을 가진 행이 두 개 이상있는 경우 createdAT> lastdate order를 createdAT 및 limit n으로 건너 뛸 수 있습니다. –

+0

이 작업을 수행한다고하더라도 다음 10 개의 게시물이 무작위로 나오지 않도록 사용자를 원하십니까? 난 그냥 인덱스 자동 증가 숫자 열을 GUID ID와 함께 갈 추가 -> 당신이 순서대로 게시물을 얻을 당신은 페이징에 대한 일반적인 방법을 사용할 수 있습니다. –

답변

0

당신은 여전히 ​​GUID의의이 작업을 수행 할 수 있지만, GUID 년대는 의사를, 때문에 당신은 ORDER BY postcommentid 순서는 아마 당신이 원하는 것이 아닐 때. 대략적인 순서대로 무언가를 원할 것입니다. 무작위 GUID로 정렬하면 순서는 반복 가능하지만 무작위입니다.

@James 주석으로 정렬 순서에 대해 다른 열을 사용할 수 있지만 해당 열은 고유해야합니다. 그렇지 않으면 중복 된 행을 놓치거나 (>을 사용하는 경우) 또는 다음 페이지에서 값을 반복합니다. (>=을 사용하는 경우).

LIMITOFFSET을 사용해야합니다. MySQL은 LIMIT 쿼리를 최적화하므로 페이지에 필요한 행을 찾으면 행을 검토하지 않습니다. 그러나 이전 행을 모두 검사해야하기 때문에 더 높은 번호의 페이지로 이동할 때 쿼리가 더 비쌉니다.

이 문제를 완화 할 수있는 방법의 몇 :

  • 은 사용자가 더 높은 번호 페이지를 볼 수 있도록하지 마십시오. 분명히 그들에게 "마지막"페이지에 대한 직접 링크를 제공하지 마십시오. 그 (것)들에게 "다음"페이지에 연결을주고 그 질문이 아주 값이 비싸게되는 때까지 전진하기 전에 그들이 포기하기를 바란다.

  • 한 번에 두 개 이상의 페이지를 가져 와서 캐시하십시오. 예를 들어 LIMIT 10 대신 LIMIT 70을 입력 한 다음 결과를 memcached 또는 다른 것으로 유지하십시오. 사용자가 해당 행 집합을 진행할 때까지 응용 프로그램 코드를 사용하여 한 번에 10 개의 행을 표시합니다. 그런 다음 8 번째 페이지로 이동 한 경우에만 다른 SQL 쿼리를 실행하십시오. 사용자는 일반적으로 몇 페이지 이상을 검색하지 않으므로 두 번째 또는 세 번째 쿼리를 실행해야하는 경우가 매우 적어집니다.

0

'다음에 의해'사용중인 열을 변경하십시오.

getPostComment(int lastPostID) 
    where PostCommentId< lastPostID order by CreatedAt,UserId desc LIMIT 10;