无限滚动的混洗数据库值

时间:2014-03-31 13:27:42

标签: mysql sql random

我目前有一个无限滚动,当用户到达页面底部时会打印数据库行块。

我想要做的是对整个数据库进行随机播放,以便用户每次加载页面时都以不同的顺序获取它们(但没有条目出现两次)。

此表只会增长,所以我希望尽可能高效地完成。

我的查询目前是:

mysqli_query($con, "SELECT * FROM shopaholic ORDER BY RAND() LIMIT 36");

这有两个明显的缺点:

  • 它可能会重复行,因为它每次都会从整个表格中选择行
  • 它正在使用RAND()所以它会非常慢

我如何以更好的方式解决这个问题?

如果您需要查看其他相关代码,请告诉我。

1 个答案:

答案 0 :(得分:0)

如果您不想跟踪用户已经看过哪些记录,那么如果他们刷新页面,他们仍然可能会看到相同的记录。

您可能会考虑放弃他们没有看到任何重复的要求,因为这是最苛刻的要求。也许只是添加一些逻辑,以便他们不会在同一页面上看到重复,所以至少它不会那么明显。

RAND()排序将扫描表格中的所有行。假设您有一些auto_increment主键,您可以选择最低和最高主键之间的随机数。您可能认为1最低,MAX()获得最高。

然后执行这样的查询,其中随机值为58494

SELECT * FROM shopaholic WHERE ID >= 58494 LIMIT 1

如果主键中没有任何空白,则可以使用=代替>=

此查询将很快,因为它只读取一条记录。因此,在循环中执行此操作(例如,对于36个记录的列表,为36次)。如果您要跟踪他们看过的记录,请根据该数据集检查每条记录,看看他们是否已经看过该记录。您还可以检查是否已经为页面加载了这个,这样您至少不会在同一页面上获得重复项。

如果您正在尝试查找用户尚未看到的记录,那么当用户通过搜索结果进行搜索时,找到他们尚未看到的“随机”记录将变得越来越昂贵,尤其是数据集增长。另一个不担心重复的原因。