【问题标题】:MySQL Query Result Offset With Limit With New Result Possibility?MySQL 查询结果偏移量与新结果可能性的限制?
【发布时间】:2013-09-12 01:08:51
【问题描述】:

我正在开发一个应用程序,该应用程序使用 20 左右的滚动加载系统,结果在您滚动时一次加载到提要中。此提要由不断添加的用户生成内容组成。这意味着结果集可以更改每个偏移 X 的查询。

假设我们加载了 20 个结果,然后滚动,再滚动 20 个,然后在滚动更多内容以加载下一个 20 个之前,另一个用户上传了一条新内容,这实际上会在下一组 20 个中显示重复内容结果,因为我们使用 OFFSET 来获得额外的结果,并且由于添加了符合查询条件的新内容,总结果集将移动 1。

解决此问题的最佳和最有效的方法是什么?我们已经尝试在 where 条件中使用行的 id 来防止重复结果,并且只对获取的新结果使用不带偏移量的限制。所以我们可以执行 WHERE id

Soo.. 还有哪些其他选择?..

【问题讨论】:

  • 可能只获取一次完整的结果集,将其存储在用户会话中,然后从保存到会话的总结果集中引用提要的下 20 个结果 - 这需要保持不变并且不包括额外的用户内容?
  • 这取决于您的数据。我会用不断增长的 id 和限制来尝试上面的事情,我只会从最后一个结果中取最大或最低的 id。总的来说,我喜欢您评论中的想法,但这需要记忆。假设您有 10k 个用户,并且您在会话中为每个用户存储 1MB,这将需要大约 10GB 的内存。
  • 在现代浏览器中,会话变量的意外更改比以前更有可能发生。我自己也被这个烧死了。这是尽量减少对会话变量的依赖程度的另一个原因。
  • 对,递增或递减 ID 方法的问题在于,我们在提要中返回的一些结果,在某些情况下,是按完全无视 ID 排序的搜索相关因子排序的,这意味着按 ID 降序排序不会以正确的搜索顺序显示数据。
  • 另外,我们不能使用具有递减/递增相关值的 where 原因,因为 2 个或更多相关值有可能相同

标签: php mysql sql web-applications feed


【解决方案1】:

您可能想尝试数据库解决方案。在初始请求中,创建并填充一个表。使用该表作为提要。

确保表名以一致的名称开头,例如 TableToFeedMyApp,并以保证其唯一性的名称结尾。然后设置一个计划的作业来查找并删除所有这些在您认为的某个时间间隔之前创建的表。

【讨论】:

  • 这似乎数据库会在一段时间后变得非常混乱,因为每分钟可能有 100 个新的提要请求,而且我认为与其他解决方案相比,创建表的开销相当大?我可能是错的。
【解决方案2】:

为什么你使用where 子句而不是limit 和offset 选项? Limit 可以接受两个参数。 offset 参数似乎完全符合您的要求。例如:

limit 100, 20

从第 101 行开始占用 20 行。那么:

limit 120, 20

从第 121 行开始占用 20 行。 (在 MySQL 计数中,偏移量从 0 开始,而不是 1。)

您需要进行的一项改进是确保记录的排序顺序稳定。本质上,稳定排序是没有具有相同值的排序键的排序。要做到这一点,只需将id 列设置为排序中的最后一列。它是唯一的,所以如果有任何重复的排序键,那么添加id 会使排序稳定。

【讨论】:

  • 这种方法不适用于这种情况——我的问题可能不够清楚。随着提要加载,如果另一个用户上传了适用于所述查询的新内容,会发生什么情况? Offset 将在以下查询中包含重复的结果,以获取使用此方法的额外 20 个结果。我们不希望这样。
  • 因为这个新内容会在结果集中引入一个具有唯一 ID 的新行
猜你喜欢
  • 2017-06-15
  • 2014-03-07
  • 2018-04-08
  • 1970-01-01
  • 2017-03-17
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多