[英]Zend_Db performances
在對一個非常大的應用程序(350個表db,一些表上數百萬個條目)中實現的不同庫/框架進行一些研究之后,我發現Zend_Db很容易做我想做的事:適配器管理,用於數據庫之間的快速切換。
問題是性能真的很低,這是一個例子( $ db是一個基本的適配器,時間只在select / fetch上計算):
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表演失敗。 我知道這不是最好的事情,但是應用程序已經開發出來了,我希望能夠減少更少的代碼。
一些想法? 難道我做錯了什么 ?
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);
抽象有代價。
Zend是一個php框架,它的詛咒比pdo這樣的原生擴展要慢得多。 Zend_DB / Zend_Db_Table在運行時創建了許多類實例。 也許你使用像apc這樣的bytecodecache或者在zend-server中內置了很快的app。
也許HipHop也是一個解決方案。
幾個指針:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.