2

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

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

谢谢!

4

3 回答 3

6

尖端:

  • 缓存表元数据。默认情况下,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查找,也许?

于 2009-08-14T00:31:58.910 回答
2

最简单的调试方法是分析您的 sql 查询。您可以使用 Firephp(firebug 插件)参见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

于 2009-08-14T00:20:50.810 回答
0

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

于 2009-08-14T12:00:13.873 回答