2009-08-14 10 views
2

私はphp、mysql、zendフレームワークを使用してWebサイトを作成しています。 SQLクエリを実行しようとすると、ページ生成が約0.5秒にジャンプします。それは高すぎます。私がsqlを回すと、ページの生成は0.001になります。 私が実行するクエリの量は、実際にページ生成時間(テストした1〜10のクエリ)には影響しません。 0.5秒での滞在 私は間違っていることを理解できません。Zend FrameworkとMysql - 非常に遅い

私は、ブートストラップでSQLへの接続:

protected function _initDatabase() 
{ 
    try 
    { 
     $config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', APPLICATION_ENV); 
     $db = Zend_Db::factory($config -> database); 
     Zend_DB_Table_Abstract::setDefaultAdapter($db); 
    } 
    catch (Zend_Db_Exception $e) 
    { 

    } 
} 

その後、私は単純なモデル

class StandardAccessory extends Zend_DB_Table_Abstract 
{ 
    /** 
    * The default table name 
    */ 
    protected $_name = 'standard_accessory'; 

    protected $_primary = 'model'; 

    protected $_sequence = false; 
} 

を持っているそして最後に、私のインデックスコントローラ内部で、私はちょうどfindメソッドを実行します。

require_once APPLICATION_PATH . '/models/StandardAccessory.php'; 
    $sa = new StandardAccessory(); 
    $stndacc = $sa->find('abc'); 

すべてがこれにかかる時間が長すぎます。助言がありますか?

ありがとうございます!

答えて

5

ヒント:

  • Cache the table metadata。既定では、Zend_Db_Tableは、テーブルオブジェクトがインスタンス化されるたびにテーブルに関するメタデータを検出しようとします。これを行う必要がある回数を減らすには、キャッシュを使用します。または、テーブルクラス(注:dbテーブルはモデルではありません)でハードコードしてください。

  • EXPLAINを使用して、MySQLの最適化計画を分析してください。インデックスを効果的に使用していますか?

    mysql> EXPLAIN SELECT * FROM standard_accessory WHERE model = 'abc'; 
    
  • 使用BENCHMARK() PHPを使用していない、クエリの速度を測定します。サブクエリは単一の列を返さなければなりません。インデックスされていない列を返すようにして、インデックスエントリを返すのではなく、クエリがデータに接触するようにしてください。

    mysql> SELECT BENCHMARK(1000, 
        (SELECT nonindexed_column FROM standard_accessory WHERE model = 'abc')); 
    
  • Zend_Db_AdapterレイジーロードというのDB接続は、最初のクエリを作成するとき。したがって、MySQLサーバーへの接続が遅くなると、(メタデータを照会するときに)Tableオブジェクトをインスタンス化する際に発生します。これには長い時間がかかる理由は何ですか? DNS lookups、おそらく?私は非常に非科学的なテストを行なったし、PDOアダプタは(私はmysqliのが速いことになっている知っているが、多分それはZFの抽象化です)自分のアプリケーションに私のために高速であることがわかった上記の提案とともに

+0

BENCHMARKのクエリは1行を返します。そうでない場合はmysqlがエラーを返します:ERROR 1242(21000):副問合せが1行以上返します。 –

+0

@レーヨン・マーティンズ:そうですね、私はOPがテーブルの主キーに対して制限している 'find()'を使っているので、私は仮定します。したがって、単一の行(または 'abc'が見つからない場合はゼロ行)を返すようにする必要があります。 –

+0

メタデータキャッシュの最初のリンクが無効になっています。私はそれがこれと仮定しています:https://framework.zend.com/manual/1.10/en/zend.db.table.html#zend.db.table。 metadata.caching –

2

これをデバッグする最も簡単な方法は、SQLクエリをプロファイルすることです。 Firephp(Firebug用プラグイン)を使用することができますhttp://framework.zend.com/manual/en/zend.db.profiler.html#zend.db.profiler.profilers.firebug

少し高速化する別の方法は、テーブルのメタデータをキャッシュすることです。 参照:http://framework.zend.com/manual/en/zend.db.table.html#zend.db.table.metadata.caching

0

hereの結果を表示します(表示された時間は比較のためだけに表示されます)