在 Zf2 中获取 50,000 多行的有效且最快的方法

Posted

技术标签:

【中文标题】在 Zf2 中获取 50,000 多行的有效且最快的方法【英文标题】:Efficient and fastest way to fetch huge 50,000+ rows in Zf2 【发布时间】:2014-03-12 06:01:18 【问题描述】:

我需要在我的代码中获取大量数据。我正在使用 zf2,目前我正在使用 Doctrine2 来处理我的数据库。但我刚刚发现 ORM 查询比普通的 mysql 查询花费更多时间。那么您能否建议我从 zf2 中的数据库中获取大量数据的最佳方法。

【问题讨论】:

您还应该注意您要如何处理这些数据 @rekire 好吧,我正在开发一个站点,将来它将在表格上拥有大量数据和大量连接。当我根据条件在网站的许多页面上获取相同的内容时,我发现 ORM 从普通 sql 获取数据的速度很慢。 恕我直言,该描述过于模糊,但我会为该连接内容创建视图。所以 ORM 应该更快地获取您的数据。借助视图,DBMS 可以更有效地连接该数据。 @rekire 所以你更喜欢 ORM 而不是普通的 MySql Query ?但是如果我不想创建视图怎么办。 @rekire 抱歉,我无法明确我的问题,我对这些数据库的事情太陌生了 【参考方案1】:

这里有几点需要考虑:

    默认情况下,Doctrine 会将数据库记录水合为 php 对象(实体):它使用查询中的数据填充实体。这是通过“智能猜测”来完成的,可以说是比较慢的。水合到阵列中,您将获得更快的响应。在manual 中阅读有关补水的更多信息。 默认情况下,Doctrine 不使用任何缓存来解析您的映射或将 DQL 转换为 SQL。您可以使用缓存来加快速度。此外,Doctrine 处理只读实体比让它们读/写更快。在manual 中阅读有关 Doctrine 性能问题的更多信息。 在 html 表(或其他任何内容)中渲染 50,000 行对您的渲染引擎 (Zend\View / php) 和 DOM(在浏览器中)来说是一种痛苦。查询可能会被优化并很快加载,将所有这些结果呈现到视图中并将它们显示到浏览器中也会非常慢。 使用分页会减小数据集的大小,同时加快查询和渲染速度。 使用 ORM 来帮助您进行映射、数据库抽象等非常好,但需要权衡:性能。使用像 Doctrine 这样的库本质上会增加执行时间:您将永远无法达到 Doctrine 中 php mysql 函数的性能。

所以:

    尽量减少一次查询的结果数,加快数据库查询、水化和渲染速度 尝试使用 Doctrine 调整性能,方法是使用数组水合、缓存和只读实体。 如果您需要尽可能快的方式,请不要使用 Doctrine。试试Zend\Db 或者自己用sql写所有东西

【讨论】:

谢谢..对我有很大帮助

以上是关于在 Zf2 中获取 50,000 多行的有效且最快的方法的主要内容,如果未能解决你的问题,请参考以下文章

读取 100,000 个 .dat.gz 文件的最快方法

从字符串中获取 IPv4 地址的最快方法

比较两个通用列表差异的最快方法

创建批处理并将函数应用于python列表的内存高效且最快的方法

如何在 zf2 中获取最后插入的 id?

Cassandra,运行子查询的有效方法是啥