【问题标题】:CakePHP: Is it possible to force find() to run a single MySQL queryCakePHP:是否可以强制 find() 运行单个 MySQL 查询
【发布时间】:2013-12-02 17:20:25
【问题描述】:

我正在使用 CakePHP 2.x。当我检查 sql 转储时,我注意到它是“自动”导致我的一个 find()s 运行几个单独的 SELECT 查询(然后可能将它们全部合并到一个漂亮的数据数组中)。

这通常没问题,但我需要在一个包含多个连接的 10K 行的表上运行一个非常大的查询,这证明魔法无法处理,因为当我尝试通过 find('all', $conditions) 构建它时查询在 300 秒后超时。但是当我使用 JOINS 手动编写等效查询时,它运行得非常快。

我的理论是,将单独的查询组合在一起所需的任何 PHP“魔法”都会导致这一大型查询的瓶颈。

  1. 我的理论是对正在发生的事情的合理解释吗?
  2. 有没有办法告诉 Cake 保持简单并制作一个大胖 SELECT 而不是花哨的自动化?

更新:我忘了提到我已经知道$this->Model->query(); 使用这就是我发现减速来自 PHP 魔法的方法。当我们这样做时,它可以工作,但是以两种不同的形式维护相同的查询感觉有点笨拙。这就是为什么我希望 CakePHP 能够提供一种替代方法,以替代从多个较小的查询构建大查询的方式。

【问题讨论】:

  • @przeqpiciel 谢谢。我知道$this->Model->query()。这是一个合适的替代方案,但我希望不要通过手动 SQL 手动完成所有操作来“把婴儿和洗澡水一起扔掉”。

标签: mysql sql cakephp cakephp-2.0


【解决方案1】:

在这种情况下,如果您查询具有 10k 条记录的表,您不应该在不限制关联的情况下执行 find('all'),以下是您可以应用的一些策略:

  1. 如果不需要相关模型,则将递归设置为 0
  2. 使用Containable Behavior 仅提供您需要的相关模型。
  3. 对查询应用限制
  4. 缓存是个好朋友
  5. Create and destroy associations on the fly 如您所愿。

由于您没有指定问题,我只是根据您遇到的问题为您提供了应用的一般想法

【讨论】:

  • 谢谢,但这对我的问题没有帮助。我需要获取关联表中的所有记录和一些数据。我已经使用$options 数组尽可能地精简了查询,但根本不这样做是不可行的。
  • 您可以分享您拥有的关联和您需要的数据吗?也许我们可以提高您的查询性能。如果我们没有看到任何代码,我们将无法帮助您。
  • 我发布了一个关于尝试优化查询的不同问题:stackoverflow.com/questions/20333276/…
猜你喜欢
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
相关资源
最近更新 更多