基本上问题出在查询SELECT COUNT(*)
中,它在activedataprovider中的calculateTotalItemCount
函数中执行。据我所知,它需要$itemcount
变量的分页。问题是这个查询对大表来说很慢。对于我~30米的桌子,它执行5秒钟。
所以有两种方法可以解决这个问题:
1.禁用分页('pagination'=>'false'
)并编写自己的分页。
2.重写AR计数功能。
我没有足够的经验/知识来完成这个。 也许有人之前有同样的问题,可以分享他的解决方案。
至少totalItemCount
我们可以使用EXPLAIN SELECT *
。它的方式更快。</ p>
我感谢任何帮助。谢谢。
答案 0 :(得分:8)
如果原始SQL中的查询比活动记录自动创建的查询“便宜”,您还可以手动查询(例如通过DAO)并在数据提供者上设置totalItemCount
:
$count = Yii::app()->db->createCommand('SELECT COUNT(*)...')->queryScalar();
$provider = new CActiveDataProvider('SomeModel', array(
'totalItemCount' => $count,
'criteria' => $criteria,
...