2013年6月30日 星期日

yii CActiveDataProvider分頁過慢

yii中常會使用CActiveDataProvider作為資料源,將資料呈現在CGridView中,
且預設會開啟會將pagination開啟,
假設我們有a、b、c、d、e五個table,a為主要的table,
yii為了計算分頁的總筆數,會產生類似以下的SQL query,

SELECT COUNT(DISTINCT `t`.`id`)
FROM `a` `t`
LEFT OUTER JOIN `b` `b` ON (`b`.`aId`=`a`.`id`)
LEFT OUTER JOIN `c` `c` ON (`a`.`cId`=`c`.`id`)
LEFT OUTER JOIN `d` `d` ON (`c`.`dId`=`d`.`id`)
LEFT OUTER JOIN `e` `e` ON (`e`.`bId`=`b`.`id`)

但若是其中某一個table的資料量太大,就會導致SQL query的結果很慢,
其實我們只是需要查詢a table的資料筆數,
這時候我們可以透過totalItemCount 這個property來取代上述自動產生的SQL query,
例如
$dataProvider = new CActiveDataProvider('Event', array(
 'totalItemCount' => A::model()->count()
 'criteria' => $criteria,
));

如此就可以加快分頁讀取的速度


沒有留言:

張貼留言