加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 14:14:17 所属栏目:PHP教程 来源:网络整理
导读:有哪些策略用于涉及复杂查询的数据集的分页? count(*)需要大约1.5秒,所以我们不想为每个页面视图命中DB.目前,此查询返回约45k行. 以下是我考虑过的一些方法: 缓存行数并每隔X分钟更新一次 限制(和偏移)计数到41的行(例如)并将页面选择器显示为“1 2 3 4 …
有哪些策略用于涉及复杂查询的数据集的分页? count(*)需要大约1.5秒,所以我们不想为每个页面视图命中DB.目前,此查询返回约45k行.

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

>缓存行数并每隔X分钟更新一次
>限制(和偏移)计数到41的行(例如)并将页面选择器显示为“1 2 3 4 …”;然后重新计算,如果有人实际进入第4页并显示“… 3 4 5 6 7 ……”
>获取行计数一次并将其存储在用户的会话中
>摆脱页面选择器,只需一个“下一页”链接

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

多列索引我应该在尝试实体化视图之前先完成此操作.

生成物化视图.我创建了一个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物化视图上消失.我已经简化了上面的内容,省略了实际操作,这些操作并不重要.

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

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

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

RE页面选择器(拇指轮)当我转向激进的查询缓存时,还会缓存拇指轮查询,当批量生成页面时,我使用临时表 – 所以计算指轮是没有问题的.大量的指轮计算被简化,因为它成为一个可预测的文件系统模式,实际上只需要最大的页面数字.最小页码始终为1.

Windowed thumbweel只要您知道最大页数,上面给出的窗口指轮(<<<<<<<<<<<<<<<< 4>>>>>>>>)的示例应该很容易做

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读