我正在开发一个基于1.3.x分支构建的遗留CakePHP应用程序,该应用程序大量使用Containable行为,特别是深层嵌套包含。
很明显,由于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'
)
)
);
答案 0 :(得分:0)
我一直在使用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项目。只需快速复制模型并运行最大的查询,然后查看查询调试输出中的差异,以了解任何差异。