2016-07-26 11 views
0

ページベースのWebアプリケーションを作成しました。私はCouchbaseとPostgresの両方のバージョンを作った。私はそれがひどい性能を持っていたので、N1QLを放棄しなければなりませんでした(多分私はそれについて別の質問をします)。そこで私はプロジェクトをN1QLからビューに移行しました。私は、低いページ数(たとえば、1ページあたり10レコード50、48ページレコード)では、ポストグル(0.07s vs 0.11s)より高いパフォーマンスを示しましたが、高いページ番号(たとえば、4000 - > 1.5秒および16000 - > 5秒)パフォーマンスは非常に悪いです。私は、ネイティブのCBライブラリとページネーションのスキップ+リミットを使用します。Couchbaseを使用したPHPページネーションは、高いページ番号で非常に遅くなります

アイデア?

PHP:ビューの

public static function findByPage($recordsPerPage, $page) { 
     $query = CouchbaseViewQuery::from("dev_".static::COLLECTION_NAME, "get_".static::COLLECTION_NAME."")->reduce(false)->skip($recordsPerPage*($page-1))->limit($recordsPerPage)->custom(array("full_set"=> "true")); 
     $data = DB::getDB()->query($query, null, true); 
     // var_dump($data); 
     $objects = array(); 
     foreach($data["rows"] as $row) { 
      $objects[] = static::find($row["key"]); 
     } 
     return $objects; 
    } 

ワン(彼らはほとんどすべて同じです):

function (doc, meta) { 
    if(doc.collection == "green_area") { 
    emit(doc._id, null); 
    } 
} 
+1

クエリとインデックス、およびEXPLAINとCouchbaseのバージョンで別の質問を投稿すると、N1QLページネゴシエーションを調べていただければ幸いです。 – geraldss

+1

ありがとうございます、私はあなたが一見をしたい場合は、別の質問をしました。私は、もし動作すればN1QLをもう一度やり、Couchbase CE 4.5.0を待ち、ビュー+全文検索を使うか、PostgreSQLを使うかのどちらかです。 –

答えて

0

これは、ビューの既知の制限です。問題は、ビュー・インデックス・レコード4000がどのくらい離れているかを知る方法がないことです。レコード4000-4004を要求すると、ビューエンジンはただ5つのレコードを生成する必要はなく、すぐに破棄して次の5つを渡す4000を生成する必要があります。ビューの性質上、複数のノードから収集して1つの結果を作成すると、これは非常に高価なものになります。このため、「スキップ」オプションを使用することはお勧めしません。

代わりに「範囲」オプションを使用することをお勧めします。これが動作する方法は、最初に範囲をオープン(つまり、すべてのレコードを含むように)として指定することです。この例は\ u00から\ u0fff(ユニコード文字の全範囲) 10レコード。その後、10番目のレコードが何であるかを覚えて、次のページの範囲の開始点として指定します)。例えば、もしあなたの10番目のレコードが 'ビール'だったら、 'ビール'から\ u0fffまでの範囲を指定します。今これは第1結果としてビールを含むでしょう、これを解決する2つの方法があります。 1つは、11の結果を要求し、最初のものを無視することです。これを解決する第2の方法は、 'beer \ u00'〜\ u0fffの範囲を 'beer'の後の最初のレコードから開始するように指定することです。

このCouchbaseのブログ記事は、より詳細に入る:http://blog.couchbase.com/pagination-couchbase

それはN1QLは、一般的にn番目のレコードはインデックスになり、必ずしもではないだろう場所を推測することができないのと同じ問題を抱えているということは注目に値しますあなたの問題に答えてください。

関連する問題