具有多个外键的CakePHP性能

时间:2012-03-03 16:16:39

标签: performance cakephp apache2 cpu

我有一个评级系统,可以评分或限定大约20个字段以及其他数据。问题可能更多的是设计问题,但蛋糕肯定不能很好地处理它,导致apache2飙升我的CPU。

我有一个叫做推荐的表,它是一个简单的ID,Name。此表填充了以下内容:

1 - 正确 2 - 不正确 3 - 失踪 4 - NA

审核表有许多字段,这些字段是推荐表的外键。

字段1 - Field20参考建议ID

我看到的是,即使我没有点击会引用评论的页面,每个页面请求都会激活CPU(apache2消耗掉50-90%的CPU)。

我猜这与蛋糕处理模型绑定的方式有关。我可以使用像枚举这样的东西,但这不是那么灵活。

关于更好的设计或如何调试蛋糕让Apache变得疯狂的任何想法?

var $name = 'Review';
var $actsAs = array('Containable');

var $validate = array(
    'service_request' => array(
        'minLength' => array(
            'rule' => array('minLength', 8),
            'message' => 'Enter a valid Service Request Number'
        ),
        'maxLength' => array(
            'rule' => array('maxLength', 8),
            'message' => 'Enter a valid Service Request Number'
        ),
        'numeric' => array(
            'rule' => 'numeric',
            'message' => 'Enter a valid Service Request Number'
        )
    )
);

var $belongsTo = array(
    'Employee' => array(
        'className' => 'Employee',
        'foreignKey' => 'reviewer_id',
    ),
    'Reviewer' => array(
        'className' => 'Employee',
        'foreignKey' => 'reviewer_id'
    ),
    'Reviewee' => array(
        'className' => 'Employee',
        'foreignKey' => 'reviewee_id'
    ),
    'Rating' => array(
        'className' => 'Rating',
        'foreignKey' => 'rating_id',
    ),
    'SrSummary' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_summary'
    ),
    'SrProduct' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_product'
    ),
    'SrVersion' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_version'
    ),
    'SrRelease' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_release'
    ),
    'SrComponent' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_component'
    ),
    'SrTechnicalProblem' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_technical_problem'
    ),
    'SrCommunicationOwner' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_communication_owner'
    ),
    'SrCommunicationGroup' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_communication_group'
    ),
    'SrOwnerGroup' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_owner_group'
    ),
    'SrOwnerGroupGeo' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_owner_group_geo'
    ),
    'SrStatus' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_status'
    ),
    'SrSubstatus' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_substatus'
    ),
    'SrSeverity' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_severity'
    ),
    'SrPriority' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_priority'
    ),
    'SrHwPlatform' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_hwplatform'
    ),
    'SrBuild' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_build'
    ),
    'SrSerial' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_serial'
    ),
    'SrManualSerial' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_manual_serial'
    ),
    'Note' => array(
        'className' => 'Note',
        'foreignKey' => 'note_id'
    ),
    'Timing' => array(
        'className' => 'Timing',
        'foreignKey' => 'timing_id'
    )
);

2 个答案:

答案 0 :(得分:0)

有一个控制器指的是所有评论。在不需要时提取数据时,需要禁用关联。您没有显示任何代码,但在运行查询之前它将看起来像这样。

$this->Model->recursive = -1;

答案 1 :(得分:0)

很难说无法调试您的网站,但是 - 有些事情。

如果您尚未使用DebugKit,请获取它。然后,您可以轻松查看运行的所有/所有mysql查询以及它们每次运行的时间。

CPU峰值可能与运行查询过多信息(即过多的相关数据)有关。获取正确版本的DebugKit,具体取决于您正在运行的Cake版本,查看所有查询以及运行所需的时间,然后调整您的关联或递归级别,或包含...等不要获取多余的数据。

(或者,如果你达到了解特定查询的问题,但无法找出原因,请将其作为另一个StackOverflow问题发布)


不相关的说明:

设置与评论相关联关联的“正常”方式是在评论表中只有一个'foreign_key'和一个'model'字段,然后设置使用这些协会 - 就像这样:

var $belongsTo = array(
    'Employee' => array(
        'className' => 'Employee',
        'foreignKey' => 'foreign_key',
        'conditions' => array('Review.model' => 'Employee')
    ),
    //...

这样,如果您添加了另一个模型,您可以链接到它,而无需在评论表中添加另一个字段。