【问题标题】:Pagination - Get all items from DB and then paginate, or get "pages" of items?分页 - 从数据库中获取所有项目然后分页,或者获取项目的“页面”?
【发布时间】:2012-02-07 19:08:10
【问题描述】:

我目前正在开发一个 Zend Framework 项目,使用 Doctrine 作为 ORM。

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

我的问题是:是先从数据库中获取所有项目,然后将它们“分页”,还是按原样获取项目的“页面”?要求?哪个对性能的影响更大?

【问题讨论】:

  • 编辑:获取所有项目将对性能产生最大的影响,但多少显然取决于项目的数量。我在使用 limit 并且仍然需要总计数时找到的最简单的解决方案是 SELECT SQL_CALC_FOUND_ROWS [columns] FROM [table] 然后 SELECT FOUND_ROWS() as rows 之后获得没有限制的“实际计数”。
  • 感谢@Mick,但这并不能真正回答我关于哪个更好的问题

标签: php zend-framework pagination doctrine-orm


【解决方案1】:

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

  1. 如果您从数据库中获取所有数据,您可以在 JavaScript 的帮助下进行分页。 页面的第一次打开需要很长时间(400 条记录是可以的)。 浏览器的内存有限。如果用户在浏览器中打开了很多选项卡 并且您占用大量内存(使用您的数据) 这会降低浏览器的速度和应用程序的速度。 您只有 400 条记录,但数据的增加经常发生。 在最坏的情况下,打开页面时整个浏览器可能会中断。 如果浏览器不支持 JS 怎么办...

  2. 如果从 DB 中获取部分数据,唯一的缺陷是如果 用户的互联网速度非常慢(但这是第一个选项中的缺陷 - 在页面的第一次刷新中)。 如果有人想访问另一个页面,它会比 JavaScript 花费更长的时间。

从长远来看,第二个选项(对我来说)更好,因为如果它有效,它将有效多年。

【讨论】:

  • 您不一定需要使用客户端资源对数据进行分页。如果您决定以编程方式执行此操作,通常最好在服务器端执行此操作(请参阅下面的答案)。但我认为使用数据库引擎本身来做这件事的提议是个好主意。 :)
  • 是的,不一定 :) 我一般比较了 JS 与 serverside(php) 分页 ...
  • 记住我使用的是zend框架!分页是通过 Zend_Paginator 完成的,所以它不是在客户端完成的。而且我总是可以使用zend的缓存来存储项目...问题是我有一个动态表可以“滑动”显示许多结果,你也可以搜索...所以我不知道是否使用分页确实很有必要......
  • 我现在知道了。在 Zend_Paginator_Adapter_DbSelect 中,您可以修改 Select_Qery (limit, order, where, ...)。对于视图文件,您应该使用 PaginationControl - framework.zend.com/manual/en/…
  • aaa,HTML TABLE 的东西......你可以设计 html 表格,但使用 ajax 获取结果(数据)......这是更难但更好的方法......
【解决方案2】:

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

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

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

【讨论】:

  • 在下面查看我的评论,让我知道你的想法......我不知道是否真的需要使用分页......由于我使用的表格的性质...... . 我可以把所有的东西都放在那里
  • 我认为根据您的 UI 元素的性质,您甚至不需要分页。我认为您可以按照自己的方式进行操作,而不会产生太大影响。
  • 是的......我在想“保持简单愚蠢”......它的工作方式很好,所以我现在会坚持下去......我会看看它有多少随着数据库大小的增加会影响性能。谢谢你们俩
  • 是的,保持简单和干净总是胜过其他一切。
猜你喜欢
  • 2014-12-29
  • 2013-10-30
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多