Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.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_Zend Framework_Pagination_Doctrine Orm - Fatal编程技术网

Php 分页-从数据库获取所有项目,然后分页,或获取;“第页”;物品的数量?

Php 分页-从数据库获取所有项目,然后分页,或获取;“第页”;物品的数量?,php,zend-framework,pagination,doctrine-orm,Php,Zend Framework,Pagination,Doctrine Orm,我目前正在开发一个Zend框架项目,使用条令作为ORM 我遇到了一种典型的情况,即必须在表中显示一个项目列表(大约400个),当然,我不想一次显示所有项目。 我以前已经使用过(只是一些基本用法),但我总是从数据库中获取所有项目,然后对它们进行分页,但现在感觉不太对劲 我的问题是:最好先从数据库中获取所有项目,然后对它们进行“分页”,还是根据请求获取项目的“页面”?哪个对性能的影响更大?数据库引擎通常最适合为您执行检索。因此,一般来说,如果您可以将数据检索任务委托给DB引擎,而不是在内存中使用编程

我目前正在开发一个Zend框架项目,使用条令作为ORM

我遇到了一种典型的情况,即必须在表中显示一个项目列表(大约400个),当然,我不想一次显示所有项目。 我以前已经使用过(只是一些基本用法),但我总是从数据库中获取所有项目,然后对它们进行分页,但现在感觉不太对劲


我的问题是:最好先从数据库中获取所有项目,然后对它们进行“分页”,还是根据请求获取项目的“页面”?哪个对性能的影响更大?

数据库引擎通常最适合为您执行检索。因此,一般来说,如果您可以将数据检索任务委托给DB引擎,而不是在内存中使用编程语言执行,那么性能的最佳选择就是让DB引擎为您执行

但也要记住,如果没有正确配置索引或没有运行良好的查询,则无法从数据库引擎中获得最佳结果


但是,现在大多数数据库引擎都能够为您优化查询,并以最正常的形式运行它们。

对我来说,最好获取部分数据,然后对它们进行分页

  • 如果从数据库中获取所有数据,则需要借助JavaScript进行分页。 第一次打开页面需要很长时间(对于400 rec.是可以的)。 浏览器内存有限。如果用户在浏览器中打开许多选项卡 而且你需要大量的内存(包括你的数据) 这将降低浏览器和应用程序的速度。 您只有400条记录,但数据的增加非常频繁。 最坏的情况是,当页面打开时,整个浏览器可能会崩溃。 如果浏览器不支持JS怎么办

  • 如果您从数据库中获取部分数据,唯一的缺陷是 用户的网速非常慢(但这是第一个选项的缺陷——页面的第一次刷新)。 如果有人想进入另一个页面,则需要比JavaScript稍长一点的时间


  • 从长远来看,第二种选择更好(对我来说),因为如果它有效,它将持续数年。

    Edit:获取所有项目将对性能产生最大影响,但影响程度显然取决于项目数量。我在使用limit时发现的最简单的解决方案,仍然需要总计数,就是从[table]中选择SQL_CALC_found_ROWS[columns],然后选择found_ROWS()作为行,以获得没有限制的“实际计数”。谢谢@Mick,但这并不能真正回答我的问题,哪一个更好?您不一定需要使用客户端资源对数据进行分页。如果您决心以编程方式进行,通常最好在服务器端进行(请参阅下面的答案)。但我认为使用DB引擎本身来实现这一点是一个好主意。:)是的,不一定:)我通常比较了JS和服务器端(php)分页……记住我使用的是zend框架!分页是通过Zend_Paginator完成的,因此它不是在客户端完成的。我总是可以用zend的缓存来存储项目。。。问题是我有一个动态表,可以“滑动”下来显示许多结果,你也可以搜索。。。所以我不知道是否真的有必要使用分页…我现在知道了。在Zend_Paginator_Adapter_DbSelect中,您可以修改Select_Qery(限制、顺序、位置……)。对于视图文件,您应该使用PaginationControl-aaa,您可以使用HTML表的内容。。。您可以设计html表,但可以使用ajax获取结果(数据)。。。这是一个更难但更好的方法…请看我下面的评论,让我知道你的想法。。。我不知道是否真的有必要使用分页。。。由于我使用的表的性质。。。我可以把所有的项目都放在里面,我不认为基于UI元素的性质,你甚至不需要分页。我想你可以按自己的方式做,不会有太大的反响。是的。。。我在想“保持简单愚蠢”。。。它的工作方式很好,所以我现在会坚持下去。。。我将看到随着数据库大小的增长,它对性能的影响有多大。。多亏了你们两个,保持简单和干净总是胜过一切。