Php Zend_Db性能
在对要在一个相当大的应用程序中实现的不同库/框架(350个表db,一些表上有数百万个条目)进行了一些研究之后,我发现Zend_db可以很容易地完成我想做的事情:在数据库之间快速切换的适配器管理 问题是性能确实很低,下面是一个示例($db是一个基本适配器,时间仅在选择/获取上计算): SQL查询(用于测试的查询,表包含约200个元素) 基本PDO-0.6392sPhp Zend_Db性能,php,performance,zend-db,Php,Performance,Zend Db,在对要在一个相当大的应用程序中实现的不同库/框架(350个表db,一些表上有数百万个条目)进行了一些研究之后,我发现Zend_db可以很容易地完成我想做的事情:在数据库之间快速切换的适配器管理 问题是性能确实很低,下面是一个示例($db是一个基本适配器,时间仅在选择/获取上计算): SQL查询(用于测试的查询,表包含约200个元素) 基本PDO-0.6392s $db = new PDO('mysql:dbname=etab_191;host=127.0.0.1', 'root'); for (
$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();
}
$db=newpdo('mysql:dbname=etab_191;host=127.0.0.1','root');
对于($i=0;$iquery($sql);
$p=$stmt->fetch(PDO::fetch_OBJ);
$stmt->closeCursor();
}
当前应用程序数据库管理器-0.7401s(mysqli核心功能上的简单抽象层)
$db=GestionConnexionBDD::getInstance('default',1)->gestionBDD;
对于($i=0;$iquery($sql);
$p=$db->fetchObject($res);
$db->freesult($res);
}
Zend_Db手动查询-1.0647s(Mv_Core_Db_Manager是基于Zend的抽象层,返回Zend_Db_Adapter_摘要列表)
$db=Mv\u Core\u db\u Manager::getInstance()->getAdapter('default',1);
对于($i=0;$iquery($sql);
$p=$stmt->fetch();
$stmt->closeCursor();
}
Zend_Db_Table_Abstract查询-3.6702s(与Zend_Db_Table_Abstract一起调整::setDefaultMetadataCache($cache))
$elmt=新元素();
对于($i=0;$i发现(2);
}
查询循环会破坏zend的性能。我知道这不是最好的做法,但应用程序已经开发好了,我希望尽可能少地修改代码
一些想法?我做错什么了吗?抽象是有代价的 Zend是一个php框架,比pdo等本机扩展慢得多。 Zend_DB/Zend_DB_表在运行时创建大量类实例。 也许你可以用字节码缓存(比如apc)或内置zend服务器快速运行你的应用程序
也许对你来说也是一个解决方案。抽象是有代价的 Zend是一个php框架,比pdo等本机扩展慢得多。 Zend_DB/Zend_DB_表在运行时创建大量类实例。 也许你可以用字节码缓存(比如apc)或内置zend服务器快速运行你的应用程序 也许对你来说也是一个解决方案。几点提示:
- 由于增加了对象化的开销,使用表/行类总是会稍微慢一点(若这是一个单词;)
- 在我的工作场所,我们在使用doctrine(1.2)时遇到了类似的问题,在接下来的几周里,我们将进行试验(遗憾的是,那篇文章中的图像已经消失了)
- 我以为Zend_Db有一个查询缓存机制,但我在参考指南中找不到关于它的信息
- 由于增加了对象化的开销,使用表/行类总是会稍微慢一点(若这是一个单词;)
- 在我的工作场所,我们在使用doctrine(1.2)时遇到了类似的问题,在接下来的几周里,我们将进行试验(遗憾的是,那篇文章中的图像已经消失了)
- 我以为Zend_Db有一个查询缓存机制,但我在参考指南中找不到关于它的信息
- 几点提示:
/////////////////////////////
// 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_DB_Abstract将在每个PHP请求上查询表元数据 这意味着要做一个DB描述表,这在某些数据库上可能非常慢 为了避免这种情况,您可以缓存此类元数据,这将提高查询性能:
/////////////////////////////
// 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_Db_Table_Abstract示例代码中有一个错误:
$Db->fetchAll($sql);
不适合。谢谢,我将其改为fetchOne()。不过,我想知道为什么您在Zend_Db_Table_Abstract类上执行find(),在Zend_Db_Adapter类上执行fetch操作;)哦,我错了,我的示例:)我认为Zend_Db_Table_Abstract的示例代码中有一个错误:$Db->fetchAll($sql)代码>不适合。谢谢,我将其改为fetchOne()。不过,我想知道为什么要在Zend_Db_Table_抽象类上执行find(),在Zend_Db_Adapter类上执行fetch操作;)糟糕的是,我错误地选择了我的例子:)这是事实,但我想知道我是否也做错了什么,然后再放弃一个更简单的解决方案。我不得不说,我对多个查询的低性能感到惊讶,但也许Zend并没有像Those那样做。Zend Framework只是另一个层,它用东西创建、解析和生成类对象,而不仅仅是传递数组。如果在如此大的数据库结构中,ZDB增加了大量开销,我也不会感到惊讶。我能想到的唯一一件事是,Zend Server应该能够很好地与Zend框架一起工作,并编译代码以实现优化和性能。但我从未尝试过。这是事实,但我想知道我是否也做错了什么,然后再放弃一个更简单的解决方案。我不得不说,我对多个查询的低性能感到惊讶,但也许Zend并没有像Those那样做。Zend Framework只是另一个层,它用东西创建、解析和生成类对象,而不仅仅是传递数组。如果在如此大的数据库结构中,ZDB增加了大量开销,我也不会感到惊讶。我能想到的唯一一件事是,Zend Server应该能够很好地与Zend框架一起工作,并编译代码以实现优化和性能。我从来没有尝试过,我是Zend Framework(ZF)的常客,虽然我的应用程序都不是eno
$db = Mv_Core_Db_Manager::getInstance()->getAdapter('default', 1);
for ($i=0; $i<2000; $i++) {
$stmt = $db->query($sql);
$p = $stmt->fetch();
$stmt->closeCursor();
}
$elmt = new Element();
for ($i=0; $i<2000; $i++) {
$elmt->find(2);
}
/////////////////////////////
// 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);