2

PHP、mysql、および zend フレームワークを使用して Web サイトを作成しています。SQL クエリを実行しようとすると、ページ生成が約 0.5 秒に跳ね上がります。それは高すぎる。SQL をオンにすると、ページ生成は 0.001 です。実行するクエリの量は、ページの生成時間に実際には影響しません (1 ~ 10 個のクエリをテストしました)。0.5秒のままで、何が間違っているのかわかりません。

ブートストラップで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' );

これには約 0.5 秒かかりますが、これは長すぎます。助言がありますか?

ありがとう!

4

3 に答える 3

6

チップ:

  • テーブルのメタデータをキャッシュします。デフォルトでZend_Db_Tableは、テーブル オブジェクトがインスタンス化されるたびに、テーブルに関するメタデータの検出を試みます。キャッシュを使用して、これを行う必要がある回数を減らします。または、Table クラスにハードコーディングします (注: db テーブルはモデルではありません)。

  • EXPLAINMySQL の最適化計画を分析するために使用します。インデックスを効果的に使用していますか?

    mysql> EXPLAIN SELECT * FROM standard_accessory WHERE model = 'abc';
    
  • BENCHMARK()PHP を使用するのではなく、クエリの速度を測定するために使用します。サブクエリは 1 つの列を返す必要があるため、インデックス エントリを返すだけでなく、クエリがデータにアクセスする必要があるように、必ずインデックスのない列を返すようにしてください。

    mysql> SELECT BENCHMARK(1000, 
      (SELECT nonindexed_column FROM standard_accessory WHERE model = 'abc'));
    
  • Zend_Db_Adapter最初のクエリを作成すると、db 接続が遅延ロードされることに注意してください。そのため、MySQL サーバーへの接続が遅い場合は、Table オブジェクトをインスタンス化するとき (メタデータを照会するとき) に発生します。これには長い時間がかかる可能性があります。 DNSルックアップ、おそらく?

于 2009-08-14T00:31:58.910 に答える
2

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

少しスピードアップするもう 1 つの方法は、テーブルのメタデータをキャッシュすることです。参照: http://framework.zend.com/manual/en/zend.db.table.html#zend.db.table.metadata.caching

于 2009-08-14T00:20:50.810 に答える
0

上記の提案に加えて、非常に非科学的なテストを行ったところ、私のアプリケーションでは PDO アダプターの方が高速であることがわかりました (mysqli の方が高速であることはわかっていますが、ZF の抽象化によるものかもしれません)。ここに結果を示します(表示されている時間は比較にのみ適しています)

于 2009-08-14T12:00:13.873 に答える