2009-08-14 65 views
2

我正在使用php,mysql和zend框架創建一個網站。 當我嘗試運行任何SQL查詢時,頁面生成跳轉到0.5秒左右。這太高了。如果我打開sql,頁面生成是0.001。 我運行的查詢量並不會真正影響頁面生成時間(1-10個測試查詢)。在0.5秒停留 我無法弄清楚,我做錯了什麼。Zend Framework和Mysql - 非常慢

我在連接到引導SQL:

protected function _initDatabase() 
{ 
    try 
    { 
     $config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', APPLICATION_ENV); 
     $db = Zend_Db::factory($config -> database); 
     Zend_DB_Table_Abstract::setDefaultAdapter($db); 
    } 
    catch (Zend_Db_Exception $e) 
    { 

    } 
} 

然後,我有一個簡單的模型

class StandardAccessory extends Zend_DB_Table_Abstract 
{ 
    /** 
    * The default table name 
    */ 
    protected $_name = 'standard_accessory'; 

    protected $_primary = 'model'; 

    protected $_sequence = false; 
} 

最後,我的索引控制器內,我只需運行find方法。

require_once APPLICATION_PATH . '/models/StandardAccessory.php'; 
    $sa = new StandardAccessory(); 
    $stndacc = $sa->find('abc'); 

這一切都需要〜0.5秒,這太長了。有什麼建議麼?

謝謝!

回答

5

提示:

  • Cache the table metadata。默認情況下,Zend_Db_Table會在每次實例化表對象時嘗試發現有關表的元數據。使用緩存來減少它必須執行的操作次數。否則在你的Table類中硬編碼它(注意:數據庫表不是型號)。

  • 使用EXPLAIN來分析MySQL的優化計劃。它是否有效地使用索引?

    mysql> EXPLAIN SELECT * FROM standard_accessory WHERE model = 'abc'; 
    
  • 使用BENCHMARK()來衡量查詢的速度,不使用PHP。子查詢必須返回一個列,因此一定要返回一個非索引列,以便查詢必須觸及數據而不是僅返回索引條目。

    mysql> SELECT BENCHMARK(1000, 
        (SELECT nonindexed_column FROM standard_accessory WHERE model = 'abc')); 
    
  • 注意當您第一個查詢Zend_Db_Adapter懶加載其數據庫連接。所以,如果連接到MySQL服務器有任何緩慢,它會發生在您實例化Table對象(當它查詢元數據時)。任何理由可能需要很長時間? DNS lookups,也許?

+0

而對BENCHMARK的查詢應該返回1行,否則mysql抱怨:錯誤1242(21000):子查詢返回多於1行。 – 2009-08-14 22:28:10

+0

@Leonel Martins:對,我認爲自從OP使用'find()'來限制表的主鍵。所以應該保證返回一行(如果沒有找到'abc',則返回零行)。 – 2009-08-14 22:32:05

+0

元數據緩存的第一個鏈接現在無效,我假設它是這樣的:https://framework.zend.com/manual/1.10/en/zend.db.table.html#zend.db.table。 metadata.caching – 2016-11-07 18:31:19

0

隨着上述建議我做了一個非常不科學的測試,發現PDO適配器是爲我快在我的應用程序(我知道mysqli的應該是快,但也許這是ZF抽象)。我顯示結果here(顯示的時間僅用於比較)