mysql - 如何使用 GUID 键对表的数据进行分页

标签 mysql database database-design primary-key surrogate-key

我有一个类似于下面的表,其中以 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评论的那样,您可以使用另一列进行排序,但该列必须是唯一的,否则您会错过一些重复的行(如果您使用>)或在下一页上重复值(如果您使用 >=)。

您只需将LIMITOFFSET 结合使用即可。 MySQL 优化了 LIMIT 查询,因此一旦找到页面所需的行,它就会停止检查行。但它还必须检查前面的所有行,因此当您浏览编号较大的页面时,查询会变得更加昂贵。

缓解这种情况的几种方法:

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

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

关于mysql - 如何使用 GUID 键对表的数据进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24093286/

相关文章:

mysql - 什么是mysql停用词文件格式?

mysql - 如果该列为空,则使用不同的 where 子句选择相同的列

mysql - 从 2 列中选择唯一值

java - MongoDB:[错误]:无法连接到位于本地主机的 MongoDB:27017

MYSQL|将值插入 SET 数据类型

azure - 这是 Azure 表中分区和行键的正确选择吗?

php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数 1 是资源

sql - 高可用性架构

sql - 中间可选模型的基本数据库设计

database - 表上的派生状态字段?