2012-01-11 107 views
1

我目前正在开发一个使用Doctrine作为ORM的Zend Framework项目。分页 - 从数据库获取所有项目然后分页,或者获取项目的“页面”?

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

我的问题是:这是更好地得到来自DB 所有项目先“分页”他们,或者得到项目的“页”,因为他们被要求?这会对性能产生更大的影响?

+1

编辑:获得所有项目对性能的影响最大,但显着取决于项目数量。 使用limit时仍然需要总数的最简单的解决方案是SELECT SQL_CALC_FOUND_ROWS [columns] FROM [table],然后选择FOUND_ROWS()作为后续行以获得没有限制的“实数”。 – 2012-01-11 12:35:56

+0

谢谢@米克,但这并没有真正回答我的问题,哪个更好 – jere 2012-01-11 14:00:50

回答

1

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

  1. 如果您从数据库中获取所有数据,请在JavaScript的帮助下分页。 页面的首次打开需要很长时间(对于400个记录是可以的)。 浏览器内存有限。如果用户在浏览器 中打开了很多标签,并且您花费了大量内存(包含您的数据) ,这会降低浏览器的速度和应用程序的速度。 您只有400条记录,但是数据的增加经常发生。 最糟糕的是,当页面打开时,整个浏览器可能会中断。 如果浏览器不支持JS ......

  2. 如果你从数据库中的数据的一部分,唯一的缺陷是,如果 用户有一个非常缓慢的上网速度(但这是第一个缺陷选项 - 在页面的第一次刷新中)。 如果有人想要转到另一个页面,它将比JavaScript花费一点时间。

从长远来看,第二种方法更好(对我来说),因为如果它起作用,它将工作多年。

+0

您不一定需要使用客户端资源对数据进行分页。如果你决心以编程的方式进行,通常在服务器端做得更好(见下面的答案)。但我认为使用数据库引擎本身的建议是一个好主意。 :) – 2012-01-11 13:16:31

+0

是的,不一定:)我比较一般JS vs serverside(php)分页... – tasmaniski 2012-01-11 13:52:28

+0

记得我使用zend框架!分页是通过Zend_Paginator完成的,所以它不在客户端完成。我总是可以使用zend的缓存来存储项目...事情是我有一个动态表,它可以“滑动”下来显示很多结果,并且你也可以搜索...所以我不知道是否这是真的使用分页... – jere 2012-01-11 14:14:52

1

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

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

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

+0

看到我的评论下面,让我知道你的想法...我不知道是否真的需要使用分页......由于我使用的表格的性质...我可以将所有项目放在那里 – jere 2012-01-11 14:16:32

+1

我不认为基于你的UI元素的性质,你甚至需要分页。我认为你可以按照自己的方式去做,而不会产生太大的影响。 – 2012-01-11 14:54:11

+0

是啊......我在想“保持简单愚蠢”......它的效果很好,所以我现在坚持下去......我会看到它会影响性能,因为数据库增长大小..感谢你们都 – jere 2012-01-11 15:08:21