【问题标题】:Does CakePHP 2.x fix performance issues with deep nested containable queriesCakePHP 2.x 是否修复了深层嵌套可包含查询的性能问题
【发布时间】:2026-01-25 04:00:02
【问题描述】:

我正在开发一个基于 1.3.x 分支的遗留 CakePHP 应用程序,它大量使用了可包含行为,特别是深度嵌套的包含。

很明显,由于 CakePHP 框架处理深层包含下的查询的方式,这是一个巨大的性能问题。在一个请求中,我们有超过 10K 的查询,随后 Cake 将数据合并到一个数组中。

谁能确认这些问题是否在 Cake 2.x 分支中得到修复,通过升级框架,我们可以在性能问题上取得进展。

由于时间限制,我们目前可以升级或重写系统部分以不使用 Containable,但不能同时使用两者。

我更愿意升级,因为还有其他好处,但我需要确保我们的性能问题会得到解决。

深层嵌套包含示例

$this->Event->find('all', array(
        'conditions' => $conditions,
        'contain' => array(
            'SessionDay' => array(
                    'Activity' => array(
                     'TimeSlot' => array(
                        'TimeSlotBooking',
                            'order' => array('slot_time' => 'asc')
                    )
                    )
            ),
            'Activity' => array(
                'TimeSlot' => array(
                    'TimeSlotBooking',
                    'order' => array('slot_time' => 'asc')
                )
            ),
            'Interview' => array(
                'InterviewBooking',
                'order' => array('interview_time' => 'asc')
            ),
            'EventCode'
            )
        )
    );

【问题讨论】:

    标签: php cakephp cakephp-1.3 cakephp-2.0


    【解决方案1】:

    我一直在使用 Cake 2.x 的项目中使用非常深的嵌套可包含查询,它们运行良好。

    它仍然会产生多个查询,并且在某些情况下不会这样做

    SELECT * FROM table WHERE x IN (1,2,3)
    

    会的:

    SELECT * FROM table WHERE x = (1)
    SELECT * FROM table WHERE x = (2)
    SELECT * FROM table WHERE x = (3)
    

    因此,您最终可能会遇到很多查询。归根结底,这将取决于您实际需要从所有表中检索多少行。

    我建议同时使用相同的数据库安装另一个 Cake 2 项目。只需快速复制您的模型并运行最大的查询,然后查看查询调试输出中的差异是否有任何差异。

    【讨论】:

    • 我怀疑你会看到查询中的任何差异,大部分改进来自于放弃 php4 支持,而 DBO 层基本保持不变。
    • @dogmatic69 这并不完全正确。 Cake >= 2 实现了PSR-0 标准,这确实对代码执行产生了积极的影响。 Evad,您还可以将 Ad Hoc 联接与“手动”查询一起使用,以获得性能。 Cake 将首先检查这些可包含的定义,然后构建查询并执行它们。因此,也许手动连接也可能是您的答案。
    • 感谢您的建议。我将在圣诞节期间尝试 Jleagle 的建议(因为我很想更新我们的核心),但出于实际工作原因,我们的首要任务是用临时加入替换最严重的违规者。如前所述,我需要确保管理层看到改进:)