php - 在 PHP 中高效地缓存和分页大型 MySQL 结果集

标签 php mysql

我有一个分布式 PHP5 应用程序,允许用户通过 MySQL 数据进行搜索和分页。有时,他们的查询可能包含数十万条记录,并且这些记录总是按时间戳排序,因此记录量和排序方式会影响性能。

我需要提高分页效率。很久以前,我放弃了 SQL_CALC_FOUND_ROWS,转而使用 COUNT(*),但这意味着查询仍然会运行两次,一次有限制,一次没有限制。

我可以结合这两个查询并依靠 PHP 对结果集进行分页,而不是使用 LIMIT 子句。更新:这是不可能的,因为大型数据集我正在尝试使用会超过为 php 设置的内存限制。由于这是分布式的,我不能指望每个人都更改他们的设置。

但是,我真的很想缓存结果并以这种方式分页 - 与不得不再次查询 MySQL 相比,我会快。因为它是分布式应用程序,所以我不会有任何我通常使用的缓存系统,如 Memcached 等。 session 存储可能太小。

还有其他选择吗?有没有更好的方法来对结果进行分页,或者有一种安全的方法来缓存结果并让 PHP 对它们进行分页?

最佳答案

您需要显示准确的结果数吗?您总是可以告诉您的用户“找到超过 1000 个结果”。此外,当您执行 count(*) 时,它可能不一定会查看表中的所有记录,它会使用表中的索引进行有效计数。

如果您的表非常庞大,您始终可以使用SHOW TABLE STATUS 查询来查找有关您的表的信息。如果是 MyISAM 表,此命令将为您提供准确的行数,但如果是 InnoDB,则可能不那么准确。

希望对你有帮助

关于php - 在 PHP 中高效地缓存和分页大型 MySQL 结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15800132/

相关文章:

javascript - Laravel 5.5 - 从 JSON 对象数组为数据表创建列标题

mysql - 选择的结果是数组,我想将它用于 "where in"另一个选择

mysql - 连接到 MySQL 数据库

mysql - 正确的 mysql 语法来更改带有排序规则的列

php MySQL语法错误

php - mySQL 给出不正确的结果

php - 字符串中的引号

mysql - 将一列乘以另一表中的一列

mysql - 查询速度的巨大差异

php - 在MySQL多重插入中将数组值连接到字符串中