在对要在一个相当大的应用程序中实现的不同库/框架进行一些研究之后(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 性能。我知道这不是最好的做法,但该应用程序已经开发完毕,我希望尽可能少地更改代码。
一些想法?难道我做错了什么 ?