Jer*_*olz 6 php mysql pagination
有哪些策略用于涉及复杂查询的数据集的分页?count(*)需要大约1.5秒,所以我们不想为每个页面视图命中DB.目前,此查询返回约45k行.
以下是我考虑过的一些方法:
我必须使用 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;
Run Code Online (Sandbox Code Playgroud)
这使得写入竞争的锁定时间mytable降至最低,并且分页查询可能会影响atbat物化视图。我简化了上面的内容,省略了实际的操作,这并不重要。
Memcache然后,我创建了一个关于数据库连接的包装器,以将这些分页结果缓存到 memcache 中。这是一个巨大的性能胜利。然而,这仍然不够好。
批量生成我编写了一个PHP守护进程并将分页逻辑提取到其中。它将检测更改mytable并定期将从最旧的更改记录到最新记录的所有页面重新生成到网络服务器的文件系统。通过一些操作mod_rewrite,我可以检查该页面是否存在于磁盘上,并提供它。这也使我能够通过让 Apache 检测标头并使用响应代码进行响应来有效利用反向代理。(显然,我删除了允许用户选择每页结果数的任何选项,这是一个不重要的功能。)If-Modified-Since304
更新:
RE count(*):当使用 MyISAM 表时,COUNT当我能够减少表上的读写争用量时,并没有产生问题。如果我使用 InnoDB,我会创建一个触发器来更新相邻表的行数。该触发器只会+1 或-1,具体取决于INSERT 或DELETE 语句。
RE 页面选择器(指轮)当我转向主动查询缓存时,指轮查询也被缓存,并且当涉及到批量生成页面时,我使用临时表——因此计算指轮没有问题。许多指轮计算得到简化,因为它成为一种可预测的文件系统模式,实际上只需要最大的页码。最小页码始终为 1。
窗口指轮上面给出的窗口指轮示例 (<< 4 [5] 6 >>) 应该很容易完成,无需任何查询,只要您知道最大页数即可。
| 归档时间: |
|
| 查看次数: |
1024 次 |
| 最近记录: |