我们有一个CakePHP查询,它真的开始让我们的服务器陷入困境。问题是返回并分页了大量记录。如果用户走到分页的末尾(例如,第60,000页),则查询会花费大量时间和我们的cpu使用天空火箭。在我们放弃并限制分页记录的数量之前,我们希望至少尝试提高查询效率。
我们知道问题是后期行查找,我们知道存在解决方案(例如:https://explainextended.com/2011/02/11/late-row-lookups-innodb/),但是我们很难将标准的CakePHP查询移动到可以帮助我们的东西。
这是我们的Cake查询:
$pagination = array(
'Sentence' => array(
'fields' => $fields,
'contain' => $contain,
'conditions' => array(
'text' => $text,
),
'limit' => CurrentUser::getSetting('per_page'),
'order' => "Sentence.id desc"
)
);
$ contains有几个关系,其中两个关系不止一层:
Array
(
[Favorites_users] => Array
(
[fields] => Array
(
)
)
[User] => Array
(
[fields] => Array
(
[0] => id
[1] => username
[2] => group_id
[3] => level
)
)
[SentencesList] => Array
(
[fields] => Array
(
[0] => id
)
)
[Transcription] => Array
(
[User] => Array
(
[fields] => Array
(
[0] => username
)
)
)
[Translation] => Array
(
[Transcription] => Array
(
[User] => Array
(
[fields] => Array
(
[0] => username
)
)
)
)
)
我们可以使用此原始查询获取基本Sentence表信息:
SELECT {$lFields}
FROM (
SELECT {$fields}
FROM sentences AS Sentence
ORDER BY
id DESC
LIMIT 10
) q
JOIN sentences l
ON l.id = q.id
ORDER BY
q.id DESC
然而,这并没有得到任何关系,而且Cake真的不同意输出格式。
那么,是否可以让Cake进行查询以尽量减少后期行查找时间?