我有一个类似于下面的表,其中以 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;
最佳答案
您仍然可以使用 GUID 执行此操作,但由于 GUID 是伪随机的,因此当您 ORDER BY postcommentid
时,顺序可能不是您想要的。您可能需要大约按时间顺序排列的内容,并且当您按随机 GUID 排序时,顺序将是可重复的,但是随机的。
正如@James评论的那样,您可以使用另一列进行排序,但该列必须是唯一的,否则您会错过一些重复的行(如果您使用>
)或在下一页上重复值(如果您使用 >=
)。
您只需将LIMIT
与OFFSET
结合使用即可。 MySQL 优化了 LIMIT 查询,因此一旦找到页面所需的行,它就会停止检查行。但它还必须检查前面的所有行,因此当您浏览编号较大的页面时,查询会变得更加昂贵。
缓解这种情况的几种方法:
不要让您的用户查看编号较高的页面。绝对不要给他们直接链接到“最后”页面。只需给他们一个指向“下一页”页面的链接,并希望他们在继续前进之前放弃搜索,以免查询成本变得非常高。
一次获取多个页面,并将其缓存。例如,您可以使用
LIMIT 70
代替LIMIT 10
,然后将结果保存在 memcached 或其他内容中。使用应用程序代码一次显示 10 行,直到用户前进到该组行。然后,仅当他们转到第 8 页时,才运行另一个 SQL 查询。用户通常不会搜索多个页面,因此您必须运行第二次或第三次查询的机会变得非常小。
关于mysql - 如何使用 GUID 键对表的数据进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24093286/