Mysql Yii activerecord和分页计数()慢查询

Mysql Yii activerecord和分页计数()慢查询,mysql,activerecord,yii,Mysql,Activerecord,Yii,所以基本上问题出在查询selectcount(*)中,它在activedataprovider的calculateTotalItemCount函数中执行。据我所知,$itemcount变量需要分页。问题是,对于大型表,这种查询速度很慢。对于我的~30m表,它执行5秒。 所以有两种方法可以解决这个问题: 1.禁用分页('pagination'=>'false')并编写自己的分页。 2.重写AR计数函数 我没有足够的经验/知识来完成这项工作。 也许有人以前也遇到过同样的问题,可以分享他的解决方案 至

所以基本上问题出在查询
selectcount(*)
中,它在activedataprovider的
calculateTotalItemCount
函数中执行。据我所知,
$itemcount
变量需要分页。问题是,对于大型表,这种查询速度很慢。对于我的~30m表,它执行5秒。 所以有两种方法可以解决这个问题: 1.禁用分页(
'pagination'=>'false'
)并编写自己的分页。 2.重写AR计数函数

我没有足够的经验/知识来完成这项工作。 也许有人以前也遇到过同样的问题,可以分享他的解决方案

至少对于
totalItemCount
我们可以使用
EXPLAIN SELECT*
。它的方式更快

谢谢你的帮助。多谢各位

如果原始SQL中的查询比活动记录自动创建的查询“便宜”,还可以手动查询(例如通过DAO)并在数据提供程序上设置
totalItemCount

$count = Yii::app()->db->createCommand('SELECT COUNT(*)...')->queryScalar();
$provider = new CActiveDataProvider('SomeModel', array(
    'totalItemCount' => $count,
    'criteria' => $criteria,
    ...

在你的计数查询中,你有什么条件吗?工作得很有魅力。谢谢你,迈克尔,你为我节省了很多时间。30914676结果页现在加载0.13秒,而不是分页10秒。也许您可以解释如何在model->search()函数的gridview()中为搜索实现更便宜的count()版本。谢谢。@ineersa不确定我是否理解:你说它有效,那么你遗漏了什么?只需在
search()
方法中使用上述内容。您需要从搜索属性手动构建
count
SQL。“便宜”的确切含义没有规则:它取决于您的DB模式。但您的问题意味着,在某些情况下,您可以提供一条SQL语句,该语句的性能优于Yii自动创建的
COUNT
。这取决于你去发现,什么时候是这种情况,以及如何建立它。谢谢你,迈克尔。我只是根据自己的需要重写了search()方法,现在效果很好。我知道AR不适合大型数据库,但我也想使用dataprovider。下次将尝试使用CSQLDataprovider。无论如何,为什么要使用这样慢的查询作为默认查询呢。