2014-06-07 64 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

@詹姆斯我有日期時間字段,但如果我們有多個具有相同日期時間的行,我們可以跳過創建AT> lastdate order by createdATand limit n期間。 –

+0

即使你得到這個工作,你的用戶會不會介意隨後10個帖子隨機抽取?我只是添加一個索引自動增加的數字列去GUID id - >你按順序獲得帖子,你可以使用普通的分頁方法。 –

回答

0

你仍然可以做到這一點與GUID的,但由於GUID的是僞隨機,當你ORDER BY postcommentid訂單可能不會是你想要的。您可能需要大致按時間順序排列的東西,並且按照隨機GUID排序,順序將是可重複的,但是是隨機的。

作爲@James評論,您可以使用另一列作爲排序順序,但該列必須是唯一的,否則您會錯過某些重複行(如果使用>)或重複下一頁上的值(如果您使用>=)。

您只需要使用LIMITOFFSET。 MySQL優化LIMIT查詢,因此一旦找到它所需的頁面行,就會退出檢查行。但它也必須檢查所有前面的行,因此當您通過較高編號的頁面前進時查詢變得更加昂貴。

幾種方法來緩解這個:

  • 不要讓您的用戶查看編號較大的頁面。絕對不要給他們直接鏈接到「最後」頁面。只要給他們一個鏈接到「下一頁」頁面,並希望他們放棄搜索之前,他們提前到目前爲止,查詢變得非常昂貴。

  • 一次抓取多個頁面並將其緩存。例如,可以用LIMIT 70代替LIMIT 10,然後將結果保存在memcached中。使用應用程序代碼一次顯示10行,直到用戶前進通過該組行。然後,只有當他們進入第8頁,運行另一個SQL查詢。用戶通常不會搜索超過幾頁,因此您必須運行第二個或第三個查詢的機會變得非常小。

0

更改您在'order by'中使用的列。

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