0

私はZendフレームワークに比較的慣れていませんが、おそらく1か月しか使用していません。実行速度が遅すぎるクエリがあります。ページの読み込みには数分かかります。私のクエリでは、すべてのレコードを取得していますか、それともページに必要な量だけを取得していますか?DBからコンテンツをフェッチする際に制限を適用できますか?

私のコードは次のとおりです。

public function init() {
  $db = Zend_Registry::get('db');
  $sql = 'SELECT * FROM employee ';
  $result = $db->fetchAll($sql);
  $page=$this->_getParam('page',1);
  $paginator = Zend_Paginator::factory($result);
  $paginator->setItemCountPerPage(5);
  $paginator->setCurrentPageNumber($page);
  $this->view->paginator=$paginator;        
}

私はあなたが私に与えることができるどんな助けにも大いに感謝します。

4

1 に答える 1

0

PaginatorファクトリにDbクエリを提供しているため、Paginatorはほとんどの場合DbSelectPaginatorアダプタを使用します。このアダプタは、Paginatorの要求を満たすために可能な限り最小のクエリを作成します。

Paginatorが正しいアダプタを使用していることを確認するには、2番目の引数として文字列を渡すことができます。

$paginator = Zend_Paginator::factory($result, 'DbSelect');

参照からの抜粋:

注: 特定のクエリの一致するすべての行を選択する代わりに、DbSelectおよびDbTableSelectアダプターは、現在のページを表示するために必要な最小限のデータのみを取得します。

このため、2番目のクエリが動的に生成され、一致する行の総数が決定されます。ただし、カウントまたはカウントクエリを自分で直接指定することは可能です。詳細については、DbSelectアダプターのsetRowCount()メソッドを参照してください。

データベースプロファイリングを使用すると、制限クエリとオフセットクエリが生成される場所を確認できます。

ノート:

ほとんどの場合、Zend_DbはSQL選択クエリをZend_Db_Selectオブジェクトに変換します。これが当てはまらないまれな状況の1つであることがわかった場合は、Paginator用の配列アダプターを使用するか、SQLをZend_Db_Selectオブジェクトとしてリファクタリングする必要があります。これは非常にまれなはずです。

また、init()メソッドにpaginatorインスタンスが表示されるのはかなり珍しいことです。init()は、そのコントローラーへのすべての要求で実行されます。

于 2012-11-28T09:14:51.033 に答える