0

我有一个类似于下面的表,它以 GUID 作为键。 我正在尝试使用以 GUID 作为键的分页来显示 tis 的内容,但遇到了我该怎么做的问题?

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;

如果它是一个 Int 键,我的存储过程看起来像这样,通过 desc 给我下 10 个订单。但是使用 GUID 不确定如何进行这种类型的分页。

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

2 回答 2

0

Change column by which You are using in 'order by'.

getPostComment( int lastPostID)
    where PostCommentId< lastPostID order by CreatedAt,UserId desc LIMIT 10;
于 2014-06-14T07:00:35.970 回答
0

您仍然可以使用 GUID 执行此操作,但由于 GUID 是伪随机的,因此您ORDER BY postcommentid的订单可能不是您想要的。您可能需要大致按时间顺序排列的东西,并且当您按随机 GUID 排序时,该顺序将是可重复的,但随机的。

正如@James 评论的那样,您可以使用另一列作为排序顺序,但该列必须是唯一的,否则您会错过一些重复的行(如果您使用>)或在下一页上重复值(如果您使用>=) .

你只需要使用LIMITwith OFFSET。MySQL 优化了 LIMIT 查询,因此一旦找到页面所需的行,它就会退出检查行。但它还必须检查所有前面的行,因此当您通过更高编号的页面时,查询会变得更加昂贵。

减轻这种情况的几种方法:

  • 不要让您的用户查看编号较高的页面。绝对不要给他们直接链接到“最后”页面。只需给他们一个指向“下一页”页面的链接,并希望他们在推进到查询变得非常昂贵之前放弃搜索。

  • 一次获取多个页面,并将其缓存。例如LIMIT 10,您可以代替 ,LIMIT 70然后将结果保存在 memcached 或其他内容中。使用应用程序代码一次显示 10 行,直到用户继续浏览该组行。然后只有当他们进入第 8 页时,才运行另一个 SQL 查询。用户通常不会搜索超过几页,因此您必须运行第二个或第三个查询的机会变得非常小。

于 2014-06-10T19:20:25.550 回答