CakePHP:后期行查找

时间:2016-11-14 06:14:27

标签: mysql cakephp innodb

我们有一个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进行查询以尽量减少后期行查找时间?

1 个答案:

答案 0 :(得分:0)

通过OFFSET的分页非常缓慢。弄清楚如何记住你离开的地方"。 More discussion