かなり大きなアプリケーション(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のパフォーマンスが低下します。私はそれが最善のことではないことを知っていますが、アプリケーションはすでに開発されており、可能な限り少ないコードを変更したいと思っています。
いくつかのアイデア?私は何か間違ったことをしていますか?