1

かなり大きなアプリケーション(350テーブルdb、いくつかのテーブルに数百万のエントリ)に実装するためにさまざまなライブラリ/フレームワークについて調査した後、Zend_Dbが私がやりたいことを非常に簡単に実行できることがわかりました:データベース間の迅速な切り替えのためのアダプタ管理。

問題は、パフォーマンスが非常に低いことです。次に例を示します($ dbは基本的なアダプターであり、時間は選択/フェッチでのみ計算されます):

SQL QUERY(テストに使用されるクエリ。テーブルには最大200個の要素が含まれます)

SELECT * FROM element WHERE id=2'

基本的なPDO-0.6392s

$db = new PDO('mysql:dbname=etab_191;host=127.0.0.1', 'root');
for ($i=0; $i<2000; $i++) {
    $stmt = $db->query($sql);
    $p = $stmt->fetch(PDO::FETCH_OBJ);
    $stmt->closeCursor();
}

現在のアプリケーションデータベースマネージャー-0.7401s(mysqliコア関数上の​​単純な抽象化レイヤー)

$db = GestionConnexionBDD::getInstance('default', 1)->gestionBDD;
for ($i=0; $i<2000; $i++) {
    $res = $db->query($sql);
    $p = $db->fetchObject($res);
    $db->freeResult($res);
}

Zend_Db手動クエリ-1.0647s(Mv_Core_Db_ManagerはZendに基づく抽象化レイヤーであり、Zend_Db_Adapter_Abstractのリストを返します)

    $db = Mv_Core_Db_Manager::getInstance()->getAdapter('default', 1);
for ($i=0; $i<2000; $i++) {
    $stmt = $db->query($sql);
    $p = $stmt->fetch();
    $stmt->closeCursor();
}

Zend_Db_Table_Abstractクエリ-3.6702s(Zend_Db_Table_Abstract :: setDefaultMetadataCache($ cache)で微調整)

$elmt = new Element();
for ($i=0; $i<2000; $i++) {
    $elmt->find(2);
}

ループでクエリを実行すると、zendのパフォーマンスが低下します。私はそれが最善のことではないことを知っていますが、アプリケーションはすでに開発されており、可能な限り少ないコードを変更したいと思っています。

いくつかのアイデア?私は何か間違ったことをしていますか?

4

3 に答える 3

2

Zend_DB_Abstractは、PHPリクエストごとにテーブルメタデータをクエリします。

これは、DB DESCRIBE TABLEを実行することを意味しますが、一部のデータベースでは非常に遅くなる可能性があります。

これを回避するには、このようなメタデータをキャッシュできます。これにより、クエリのパフォーマンスが向上します。

    /////////////////////////////
    // getting a Zend_Cache_Core object
    $cache = Zend_Cache::factory('Core',
        'File',
        array('lifetime' => 86400, 'automatic_serialization' => true ),
        array('cache_dir' => $config->cacheDir));

    // Next, set the cache to be used with all table objects
    Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);
于 2014-10-21T15:04:23.820 に答える
1

いくつかのポインタ:

  • テーブル/行クラスの使用は、客体化のオーバーヘッドが追加されるため、常にわずかに遅くなります(それが単語でさえある場合;))
  • 私の職場では、Doctrine(1.2)を使用して同様の問題が発生しました。今後数週間で、APCを実験する予定です(残念ながら、その記事の画像はなくなりました)
  • Zend_Dbにはクエリキャッシュメカニズムがあると思いましたが、リファレンスガイドでそれに関する情報を見つけることができません
于 2012-05-10T12:38:18.847 に答える
1

抽象化には代償があります。

Zendはphpフレームワークであり、pdoのようなネイティブ拡張機能よりもはるかに低速です。Zend_DB / Zend_Db_Tableは、実行時にクラスのインスタンスを多数作成します。apcやzend-serverのビルトインのようなバイトコードキャッシュを使用して、アプリを非常に高速に実行できるかもしれません。

多分HipHopもあなたのための解決策です。

于 2012-05-10T12:33:02.787 に答える