CakePHP Performance с несколькими внешними ключами - PullRequest
0 голосов
/ 03 марта 2012

У меня есть рейтинговая система, которая оценивает или оценивает около 20 полей вместе с другими данными. Проблема может быть скорее в проблеме дизайна, но торт, конечно, не справляется с этим, вызывая скачкообразную загрузку apache2.

У меня есть таблица с рекомендациями, которая представляет собой простой идентификатор, имя. Эта таблица заполнена чем-то вроде этого:

1 - правильно 2 - Неверно 3 - Отсутствует 4 - NA

В таблице обзора есть несколько полей, которые являются внешними ключами таблицы рекомендаций.

Поле 1 - Ссылочные рекомендации Field20 ID

Что я вижу, так это то, что каждый запрос страницы будет нагружать ЦП (apache2 потребляет где-то от 50-90% ЦП), даже когда я не захожу на страницу, которая будет ссылаться на отзывы.

Полагаю, это связано с тем, как торт обрабатывает привязки моделей. Я мог бы использовать что-то вроде enum, но это не так гибко.

Есть мысли о лучшем дизайне или о том, как отладить, почему торт заставляет 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 голосов
/ 04 марта 2012

Трудно сказать, не имея возможности отладить ваш сайт, но - несколько вещей.

Если вы еще не используете DebugKit , получите его. Затем вы можете легко просмотреть любые / все запущенные MySQL-запросы, а также сколько времени они заняли.

Пик (и) ЦП, скорее всего, связан с выполнением запроса, который извлекает слишком много информации (т.е. слишком много связанных данных). Получите правильную версию DebugKit в зависимости от того, какую версию Cake вы используете, и посмотрите на все запросы и сколько они потребуются для выполнения, затем настройте свои ассоциации или рекурсивный уровень или содержит ... и т.д., чтобы избежать получения лишних данных.

(Или, если вы дойдете до точки, когда вы знаете, что конкретный запрос является проблемой, но не можете понять, почему, опубликуйте это как еще один вопрос StackOverflow)


Примечание не связано:

"Нормальный" способ установить тип связей, которые вы делаете с Обзорами, - это просто иметь поле 'foreign_key' и 'model' в вашей таблице обзора, а затем настроить свои ассоциации, используя эти - как то так:

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

Таким образом, если вы когда-нибудь добавите другую модель, вы можете ссылаться на нее, не добавляя еще одно поле в таблицу отзывов.

0 голосов
/ 03 марта 2012

Есть контроллер, который ссылается на все отзывы. Вам нужно отключить ассоциации, когда вы извлекаете данные, когда они не требуются. Вы не показали никакого кода, но он будет выглядеть примерно так до запуска запроса.

$this->Model->recursive = -1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...