簡體   English   中英

Zend_Db表演

[英]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也是一個解決方案。

幾個指針:

  • 使用表/行類總是會稍微慢一點,因為客觀化的額外開銷(如果這甚至是一個單詞;))
  • 在我的工作場所,我們在使用學說(1.2)時遇到了類似的問題,在接下來的幾周內我們將試驗APC (遺憾的是,該文章上的圖像已經消失)
  • 我認為Zend_Db有一個查詢緩存機制,但我在參考指南中找不到有關它的信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM