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

在PHP中高效缓存和分页大型MySQL结果集,php,mysql,Php,Mysql,我有一个分布式PHP5应用程序,允许用户通过MySQL数据进行搜索和分页。有时,他们的查询可能包含数十万条记录,并且这些记录总是按时间戳排序,因此记录的数量和排序方式会影响性能 我需要提高分页的效率。很久以前,我放弃了SQL\u CALC\u FOUND\u ROWS,而选择了COUNT(*),但这意味着查询仍然运行两次,一次有限制,一次没有限制 我可以将这两个查询结合起来,依靠PHP对结果集进行分页,而不是使用LIMIT子句。更新:这是不可能的,因为我尝试使用的大型数据集将超过为php设置的内

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

我需要提高分页的效率。很久以前,我放弃了
SQL\u CALC\u FOUND\u ROWS
,而选择了
COUNT(*)
,但这意味着查询仍然运行两次,一次有限制,一次没有限制

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

然而,我真的很想缓存结果并以这种方式分页——这比再次查询MySQL要快得多。因为它是一个分布式应用程序,所以我没有任何通常使用的缓存系统,如Memcached等。会话存储可能太小


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

是否需要显示结果的确切数量?你可以告诉你的用户“找到了1000多个结果”。此外,当您进行计数(*)时,它可能不一定要查看表中的所有记录,而是使用表上的索引进行有效计数

如果您的表很大,您可以始终使用
显示表状态
查询来查找有关表的信息。如果是MyISAM表,此命令将提供确切的行数,但如果是InnoDB,则可能不那么准确


希望这有帮助

谢谢,但不幸的是,它没有。用户正在运行报告并查询各种各样的数据。用户通常拥有数十万条记录,甚至1亿条记录。很难知道他们要查询什么数据,所以即使设置索引也很困难。我们使用结果总数来计算有多少页,这样它们就可以分页了。现在,我只是缓存计数,直到搜索条件改变,这样我们就不会计算每页的变化。如果是1亿行,而每页最多显示100行,那么用户说“显示第1/1000000页”或“显示第1/1000001页”是否重要?我怀疑!您不妨说“显示多页中的第1页”,然后建议如何显示最后一组结果的页码。他们需要能够快速跳转到结尾你必须了解用户是如何使用你的系统的,如果他们只需要跳转到结尾,那么你为什么不按降序排列你的记录呢?这样他们就只能处理前几页了。如果他们需要从第1页到第1000000页之间的任意位置跳转,则说明您存在严重的设计缺陷,需要提供更好的过滤器来缩小搜索结果的范围。或者您甚至可以将“第1000001页”替换为“最后一页”,用户不在乎您有多少页,只要单击“最后一页”,就可以抓取最后100行。另一种选择: