Zend Framework和Mysql - 非常慢

时间:2009-08-14 00:12:36

标签: mysql zend-framework zend-db-table

我正在使用php,mysql和zend框架创建一个网站。 当我尝试运行任何sql查询时,页面生成跳转到大约0.5秒。那太高了。如果我转向sql,页面生成为0.001。 我运行的查询量并不会真正影响页面生成时间(测试的1-10个查询)。停留0.5秒 我无法弄清楚,我做错了什么。

我在bootstrap中连接到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秒,这太长了。有什么建议?

谢谢!

3 个答案:

答案 0 :(得分:6)

提示:

  • Cache the table metadata。默认情况下,Zend_Db_Table尝试在每次实例化表对象时发现有关表的元数据。使用缓存可以减少执行此操作的次数。或者在Table类中对其进行硬编码(注意: db表不是模型)。

  • 使用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

答案 1 :(得分:2)

调试此问题的最简单方法是分析您的SQL查询。你可以使用Firephp(萤火虫插件)见http://framework.zend.com/manual/en/zend.db.profiler.html#zend.db.profiler.profilers.firebug

另一种加快速度的方法是缓存表格的元数据。 见:http://framework.zend.com/manual/en/zend.db.table.html#zend.db.table.metadata.caching

答案 2 :(得分:0)

除了上述建议,我做了一个非常不科学的测试,发现PDO适配器在我的应用程序中对我来说更快(我知道mysqli应该更快但可能是ZF抽象)。我显示结果here(显示的时间仅适用于比较)