2016-11-14 6 views
1

私たちは本当に私たちのサーバーを動かすようになっているCakePHPクエリを持っています。問題は、膨大な数のレコードが返され、改ページされることです。ユーザーがページングの最後に行くと(たとえば60,000ページ)、クエリには膨大な時間がかかり、CPU使用率が高くなります。あきらめる前に、ページングレコードの数を制限する前に、少なくともクエリをより効率的にするようにしたいと考えています。CakePHP:late row lookup

問題は後で行が検索され、解決策が存在することがわかっています(たとえば、https://explainextended.com/2011/02/11/late-row-lookups-innodb/)。標準的なCakePHPクエリを私たちを助けるものに移動するのは苦労しています。

これが私たちのケーキのクエリです:

$pagination = array(
    'Sentence' => array(
     'fields' => $fields, 
     'contain' => $contain, 
     'conditions' => array(
      'text' => $text, 
     ), 
     'limit' => CurrentUser::getSetting('per_page'), 
     'order' => "Sentence.id desc" 
    ) 
); 

$が含まれているが、深い1層以上あるうちの2つは、いくつかの関係を、持っている:

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 
           ) 

         ) 

       ) 

     ) 

) 

私たちは、これで基本文のテーブルの情報を取得することができます生のクエリ:

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は実際には同意しません出力形式で出力します。

だから、ケーキに遅い行のルックアップ時間を最小限にするクエリを出すことは可能ですか?

+0

正確なCakePHPのバージョンを必ずご記入ください!異なるバージョンの問題では、さまざまな方法で問題を解決できます。 – ndm

+0

ああ、申し訳ありません。そのレガシー1.3ケーキアプリ。ええ、私は知っている..... –

答えて

0

改ページ番号OFFSETは非常に遅いです。どのように "あなたが中断したかを覚えている"方法を解説します。 More discussion