У меня есть приложение cakephp, 2.4, и у меня возникают проблемы с компонентом Paginator. Во-первых, это не база данных, это, безусловно, выполнение анализа результатов запроса. У меня установлен DebugKit и я вижу, что мой запрос mysql для разбитых на страницы данных занимает всего 2 мс. В таблице содержится 2,5 миллиона записей сообщений и 500 000 пользователей. Очевидно, что правильная индексация на месте. Но действие контроллера составляет 6167,82 мс. Итак, вот мое действие контроллера:cakephp paginator чрезвычайно медленный
$this->Paginator->settings = array(
'Message' => array(
'fields' => array(
'Recipient.username',
'Recipient.profile_photo',
'Recipient.id',
'Message.*'
),
'joins' => array(array(
'table' => 'users',
'alias' => 'Recipient',
'type' => 'LEFT',
'conditions' => array(
'Recipient.id = `Message`.`recipient_id`'
)
)),
'conditions' => array(
'Message.sender_id' => $this->Auth->user('id'),
'Message.deleted_by_sender' => '0'
),
'limit' => 10,
'order' => 'Message.id DESC',
'recursive' => -1
)
);
$sents = $this->Paginator->paginate('Message');
$this->set('sents', $sents);
$this->view = 'index';
Я искал эту страницу и искал переполнение стека. Большинство ответов относятся к плохой оптимизации mysql, что не является моим делом. Другая половина ответов кажется сдерживаемой. Итак, я попытался сдержать. Использование содержимого было на самом деле медленнее, потому что оно пыталось захватить еще больше данных из поля пользователя, чем просто имя пользователя, фотографию и идентификатор. Затем, когда торт построил массив из результатов запроса, он выполнил почти 500 мс медленнее с возможностью скрыть из-за дополнительных пользовательских данных, которые я предполагаю.
Я собираюсь теперь выкопать компонент пирога Paginator и посмотреть, почему он так долго пытается построить ответ. Я надеюсь, что кто-то меня избивает, и у нас есть хорошее решение, чтобы ускорить это.
Мой веб-сервер работает с ubuntu 12.04 с 3-гигабайтным баком, apache и mod_php с установленным apc и работает для модели и кэш-памяти ядра. База данных находится на отдельном сервере. У меня также есть сервер redis, сохраняющий другие пользовательские данные и данные сеанса торта. Здесь много возможностей для анализа 10 записей из запроса mysql, содержащего около дюжины строк.
EDIT: ответ
Как было предложено первым Илие Pandia там было что-то еще происходит, например, обратный вызов, который был замедляя пагинацию. Это было фактически не связано с компонентом разбивки на страницы. Модель Получателя имела поведение, которое загрузило sdk в обратном вызове установки для сторонней службы. Эта служба занимала несколько секунд, чтобы ответить. Это произошло, когда связанныйМодель в запросе был загружен для фильтрации результатов. Надеюсь, что кто-либо еще ищет причины, по которым торт может плохо работать, также будет смотреть на обратные вызовы моделей в приложении и плагинах.
ralationship - это просто сообщение принадлежит получателю или есть больше? – arilia
Сообщение принадлежит отправителю, получателю и массовому сообщению. Сегодня утром я отлаживал это около часа и выяснил, что так долго. Я еще не понял, почему. Я обновлю это, как только узнаю больше. – mneil
Я столкнулся с той же проблемой.Я предполагаю, что это потому, что компонент Paginator нуждается в общем счетчике и сначала делает запрос с 'WHERE 1 = 1', а затем разбивается на страницы в соответствии с' limit' – zeflex