gpt4 book ai didi

MySQL 随机分页

转载 作者:行者123 更新时间:2023-11-29 18:28:51 25 4
gpt4 key购买 nike

我正在尝试通过项目的随机排序来实现一些分页。我已经有了一个解决方案,如果可行,我需要专家的建议。

我的 table 看起来像:

id | category | product_name | product_description | product_image | filter1 | filter2 | filter 3 .. bla bla bla

我想根据一些过滤器对搜索结果进行分页并随机化结果。

我认为我应该制作另一个表,其中只保留产品的 ID、类别和过滤器以及所有过滤可能性的索引。然后,当发生搜索时,我根据某些特定索引搜索较小的表,并将 ids 保存在数组中并在 PHP 中随机化它们。

编辑:我的表有大约 500k - 100 万个条目。

会很慢吗?

最佳答案

  1. 过滤 1M 行以查找 100K 行 - 对 1M 行进行全表扫描
  2. 从 100K 行中随机选择 10 行——扫描 100K 行,除非您使用 http://mysql.rjweb.org/doc.php/random 中的某些技术。 .
  3. 留下一些可以让你“分页”的东西。您是否关心它是否意外重复行?这是基于网络的,意味着“留下一些东西”可能会很困惑 - 例如列出在[下一步]按钮的网址中已经看到的所有项目。
  4. 通过 LIMIT 和 OFFSET 进行分页的顺序是(N*N),遍历所有 N 页。 100K 行,一次 10 行,大约是 500M。比原来的1M还要差。

现在,让我发明一个解决方案,解决“随机”和“分页”的成本。请参阅http://mysql.rjweb.org/doc.php/random#case_extra_float_column_for_randomizing

  1. 准备:添加一个额外的列,其中包含一些随机数。索引它。这将成为随机发生器和“你离开的地方”,以避免使用昂贵的 OFFSET
  2. 请参阅链接,了解获取前 10 个随机行的一种方法。
  3. 参见http://mysql.rjweb.org/doc.php/pagination了解有关“记住您上次停下的地方”的更多信息。

完成所有这些操作,成本就变成了最初的步骤 1 的大部分,即过滤 1M 行所需的一切。希望它的成本不会那么高——这取决于是否有一个合适的索引可以一直达到LIMIT 10。 (我的直觉告诉我这不切实际。)

总结:

SELECT ...
FROM ...
WHERE filters...
AND rnd > $left_off
ORDER BY rnd
LIMIT 10;

如果您从 0 开始 $left_off,您会得到一个可重复但看似随机的序列。而[Next]按钮只需要传递从当前页面获取的rnd的最后一个值。

现在要使其不可重复吗?每晚重新填充rnd。 (这会扰乱分页过程中的任何人。)

关于MySQL 随机分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45903619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com