1

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

一些想法?难道我做错了什么 ?

4

3 回答 3

2

Zend_DB_Abstract will query table metadata on each PHP request.

This means doing a DB DESCRIBE TABLE, that can be very slow on some databases.

To avoid this, you can cache such metadata, and this will improve query performance:

    /////////////////////////////
    // 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

A few pointer:

  • using Table / Row classes will always be slightly slower because of the added overhead of the objectification (if that is even a word ;) )
  • at my workplace we just had similar problems using doctrine (1.2), in the next few weeks we'll be experimenting with APC (sadly, the images on that article are gone)
  • I thought Zend_Db had a query cache mechanism, but I can't find informations about it in the reference guide
于 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 回答