gpt4 book ai didi

php - 复杂(慢速)数据集的分页策略

转载 作者:可可西里 更新时间:2023-11-01 06:41:39 27 4
gpt4 key购买 nike

用于涉及复杂查询的数据集分页的一些策略是什么? count(*) 需要大约 1.5 秒,所以我们不想为每个页面 View 访问数据库。目前,此查询返回了约 45k 行。

以下是我考虑过的一些方法:

  • 缓存行数并每 X 分钟更新一次
  • 限制(和偏移)计数到 41 的行(例如)并将页面选择器显示为“1 2 3 4 ...”;然后重新计算是否有人真正转到第 4 页并显示“... 3 4 5 6 7 ...”
  • 获取一次行数并将其存储在用户的 session 中
  • 摆脱页面选择器,只有“下一页”链接

最佳答案

我不得不使用 PHP 和 MySQL 为一个每天页面浏览量超过一百万的网站设计一些分页策略。我分阶段执行该策略:

多列索引 在尝试物化 View 之前,我应该先做这件事。

生成物化 View 。我创建了一个 cron 作业,它对我正在使用的文档表进行了常见的非规范化。我将 SELECT ... INTO OUTFILE ... 然后创建新表,并将其旋转到:

SELECT ... INTO OUTFILE '/tmp/ondeck.txt' FROM mytable ...;
CREATE TABLE ondeck_mytable LIKE mytable;
LOAD DATA INFILE '/tmp/ondeck.txt' INTO TABLE ondeck_mytable...;
DROP TABLE IF EXISTS dugout_mytable;
RENAME TABLE atbat_mytable TO dugout_mytable, ondeck_mytable TO atbat_mytable;

这将写入竞争 mytable 的锁定时间降至最低,并且分页查询可能会影响 atbat 物化 View 。我已经简化了上面的内容,省略了不重要的实际操作。

Memcache 然后,我创建了一个关于我的数据库连接的包装器,以将这些分页结果缓存到 memcache 中。这是一个巨大的性能胜利。然而,它仍然不够好。

批量生成 我编写了一个 PHP 守护程序并将分页逻辑提取到其中。它会检测到 mytable 的变化,并定期重新生成从最旧的更改记录到最近的记录所有页面到网络服务器的文件系统。通过一些 mod_rewrite,我可以检查该页面是否存在于磁盘上,并提供它。这也让我能够通过让 Apache 检测 If-Modified-Since header 并使用 304 响应代码来响应,从而有效地利用反向代理。 (显然,我删除了任何允许用户选择每页结果数的选项,这是一个不重要的功能。)

更新:RE count(*): 使用 MyISAM 表时,COUNT 没有造成问题,因为我能够减少读取量-把争论写在 table 上。如果我在做 InnoDB,我会创建一个触发器,用行数更新相邻的表。该触发器只会 +1 或 -1,具体取决于 INSERT 或 DELETE 语句。

RE page-pickers (thumbwheels) 当我转向主动查询缓存时,拇指轮查询也被缓存,当涉及到批量生成页面时,我使用的是临时表——所以计算指轮没有问题。许多指轮计算得到简化,因为它变成了一种可预测的文件系统模式,实际上只需要最大的页码。最小页码始终为 1。

Windowed thumbweel 您在上面给出的窗口指轮 (<< 4 [5] 6 >>) 的示例应该很容易做到,根本不需要任何查询,只要您知道您的最大值页数。

关于php - 复杂(慢速)数据集的分页策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1701967/

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