Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 跟踪一系列分页结果中的项目总数_Php_Mysql_Pagination - Fatal编程技术网

Php 跟踪一系列分页结果中的项目总数

Php 跟踪一系列分页结果中的项目总数,php,mysql,pagination,Php,Mysql,Pagination,处理分页结果时,跟踪项目总数的理想方法是什么? 一开始这似乎是一个简单的问题,但当我真正开始思考如何有效地做这件事的时候,它就稍微复杂了一点(对我来说……如果你觉得这太愚蠢了,现在就别说了) 我需要从数据库中获取项目数。这很简单。然后,我可以将此计数存储在某个变量中(例如$\u会话变量)。我可以检查此变量是否已设置,如果未设置,请再次获取计数。诀窍在于决定什么是确定何时需要获得新计数的最佳方法。如果我在总数中添加/删除了项目,或者如果我正在重新加载或重新访问网格,我似乎需要获得一个新的计数 那么

处理分页结果时,跟踪项目总数的理想方法是什么?

一开始这似乎是一个简单的问题,但当我真正开始思考如何有效地做这件事的时候,它就稍微复杂了一点(对我来说……如果你觉得这太愚蠢了,现在就别说了)

我需要从数据库中获取项目数。这很简单。然后,我可以将此计数存储在某个变量中(例如$\u会话变量)。我可以检查此变量是否已设置,如果未设置,请再次获取计数。诀窍在于决定什么是确定何时需要获得新计数的最佳方法。如果我在总数中添加/删除了项目,或者如果我正在重新加载或重新访问网格,我似乎需要获得一个新的计数

那么,我将如何决定何时清除此$\u会话变量?我可以看到在更新/删除之后清除它并获得一个新的计数(或者甚至添加或减去它以避免潜在的昂贵的数据库命中),但是(我发现这是一个棘手的部分),当有人离开页面或等待可变的时间后再转到下一个结果页面或重新加载页面时会发生什么

由于我们可能要处理数万或数十万个结果,因此从数据库中获取这些结果的计数可能非常昂贵(对吗?或者我的假设不正确?)。因为我需要总计数来处理分页结果中的总页数。。。处理这种情况并坚持下去的最有效方法是什么。。。可能需要多长时间

顺便说一句,我将使用SQL查询获得计数,如下所示:

SELECT COUNT(id) FROM foo;

为什么要将其存储在会话变量中?每个用户的结果会改变吗?我宁愿将其存储在用户缓存(如APC或memcached)中,明智地选择缓存键,然后在插入或删除与查询相关的记录时清除它

这样做的一个好方法是使用一个ORM来为你做这件事,就像信条一样,它有一个

为了获得计数,我知道使用count(*)并不比使用count(id)更糟糕。(问题:这样更好吗?)


编辑:关于这篇有趣的文章,在

上,为什么要将它存储在会话变量中?每个用户的结果会改变吗?我宁愿将其存储在用户缓存(如APC或memcached)中,明智地选择缓存键,然后在插入或删除与查询相关的记录时清除它

这样做的一个好方法是使用一个ORM来为你做这件事,就像信条一样,它有一个

为了获得计数,我知道使用count(*)并不比使用count(id)更糟糕。(问题:这样更好吗?)


编辑:

上关于此的有趣文章很可能
foo
id
列上定义了一个
主键
索引。索引的
COUNT()
查询在数据库上通常非常容易


但是,如果您想多走一步,另一种选择是在代码中插入一个特殊的钩子,用于在
foo
中插入和删除行。让it在每次插入/更新后将总记录数写入受保护的文件,并从中读取。如果每次成功的插入/更新都被记录,则受保护文件中的数字始终是最新的。

很可能
foo
id
列上定义了
主键。索引的
COUNT()
查询在数据库上通常非常容易


但是,如果您想多走一步,另一种选择是在代码中插入一个特殊的钩子,用于在
foo
中插入和删除行。让it在每次插入/更新后将总记录数写入受保护的文件,并从中读取。如果每次成功的插入/更新都被记录,则受保护文件中的数字始终是最新的。

我从不使用会话变量存储查询中找到的总数,当我获取信息时,我会在常规查询中包括计数,而计数本身来自第二次查询:

// first query
SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 0, 20;
// I don´t actually use * but just select the columns I need...

// second query
SELECT FOUND_ROWS();
由于第二个查询,我从未注意到任何性能下降,但我想如果你想确定的话,你必须测量一下


顺便说一句,我在PDO中使用了它,我没有在普通MySQL中尝试过。

我从不使用会话变量来存储查询中找到的总数,当我获得信息时,我会在常规查询中包含计数,计数本身来自第二个查询:

// first query
SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 0, 20;
// I don´t actually use * but just select the columns I need...

// second query
SELECT FOUND_ROWS();
由于第二个查询,我从未注意到任何性能下降,但我想如果你想确定的话,你必须测量一下


顺便说一句,我在PDO中使用了这个,我没有在普通MySQL中尝试过。

在这么多的结果中,你可能只想使用一个整数,比如说大约22K个结果或类似的东西。在这么多的结果中,你可能只想使用一个整数,比如说大约22K个结果或类似的东西。“为什么要将其存储在会话变量中?“唯一的原因是它可以在他们花在结果页面之间的时间内重复使用。假设APC、memcached和/或条令不可用,您还有其他建议吗?这些都是有用的建议。。。我们正在寻找最简单的方法来实现这一点。问题是,有了缓存系统,缓存将持续跨越页面和用户,这是一个巨大的好处。如果我推荐的两种很酷的工具都不可用,那么您仍然可以构建自己的缓存系统,就像下面这个:但是安装和使用这些工具要简单得多SGREG所说的是基于文件的缓存,它不是用户特定的,示例:您将创建一个过期的文件,它将在每次加载页面时检查其数据是否不足,然后将其删除,然后重新运行query@rg88APC死气沉沉,你真的应该考虑使用它,我认为MeMcCurk必须是相同的。它们都将用户缓存存储在内存中,因此这比fi的性能要好得多