当运行SELECT查询时,好像Yii经常执行两次查询。第一个是COUNT(),第二个是实际查询。
造成这种情况的原因是什么?这看起来非常低效。
在相关的说明中,为什么Yii经常执行SHOW COLUMNS FROM和SHOW CREATE TABLE?不在模型中建立关系告诉Yii关于模式吗?
答案 0 :(得分:3)
我假设您正在使用有效记录以及CGridView
和CListView
等列表小部件。
造成这种情况的原因是什么?这看起来非常低效。
好吧,为了使分页在CListView
和CGridView
中工作,分配的CActiveDataProvider
(或实际上任何数据提供者)需要获取总项目数。这不适用于通常应用LIMIT
子句的结果集。因此,执行额外的COUNT()
来检索所述号码。
在相关的说明中,为什么Yii经常执行SHOW COLUMNS FROM和SHOW CREATE TABLE?不在模型中建立关系告诉Yii关于模式吗?
没有。 Yii远不止管理相关模型。 AR抽象层的一部分还用于确定表中可用的字段,因此可以在表示表行的模型上访问。但是,您不必忍受这种情况,因为可以方便地缓存模式。为此,请按照下列步骤操作:
CApcCache
节的protected/config/main.php
中配置components
等缓存组件。更改db
组件的配置,使其包含以下行:
'schemaCacheId'=>'cache', // This is the name of the cache component you
// configured in step 1. It's also the default value.
'schemaCacheDuration'=>3600, // Cache table schemata for an hour.
// Set this higher if you like.
建议;不要在开发环境中执行此操作:如果数据库设计发生更改,AR模型可能不会因过时的缓存而反映此情况。