我有一个Yii下拉列表,它加载了一个城市,州,拉链码,纬度和经度表。加载状态下拉列表时,它需要永远。有没有办法加快查询速度以减少页面加载时间?我已经包含了我的观点:
echo $form->dropDownList($model,'State', CHtml::listData(Zipcodes::model()->findAll(),
'State', 'State', 'State'), array('empty'=>'-- Choose State --'));
该表是41,000个条目。在listData()中设置$ groupField似乎没有给出任何明显的改进。
答案 0 :(得分:3)
我认为你可以有两种方式:
1)使用缓存(有很长或没有过期时间,因为你拥有的这些数据不是动态的)。 第一次加载时间不会改变,但在此之后,它会更快,更快,因为缓存将被保存。 http://www.yiiframework.com/doc/guide/1.1/en/caching.data#query-caching
$zipcodes = Zipcodes::model()->cache(3600*24*7)->findAll(); //cache for a week
//... 'components' => array( //... 'cache'=>array( 'class'=>'system.caching.CFileCache', //'class'=>'system.caching.CDummyCache', //other cache class ), //... ), //...
2)也许可以考虑尝试 CJuiAutoComplete http://www.yiiframework.com/doc/api/1.1/CJuiAutoComplete/ 它只会在输入和匹配您感兴趣的数据时为您提供结果。
答案 1 :(得分:1)
不加载41k条目并将它们放在HTML <option>
标签中似乎是一个非常好的开始......: - )
仅使用AJAX加载您需要的那些。
答案 2 :(得分:1)
状态下拉列表是否从该表中剔除了唯一的状态,即最终得到50个结果?您可能希望手动构建查询并查看瓶颈所在。对于复杂查询,这通常比使用AR快得多,我假设您正在使用AR来创建模型。我还假设你不试图将41k记录加载到下拉列表中。
我们可能需要更多关于表格结构,如何创建模型等的详细信息。
答案 3 :(得分:1)
使用CDbCriteria,我为查询设置了“GROUP BY”:
$stateGroupBy = new CDbCriteria; // i got that bitch criteria. bitches love criteria!
$stateGroupBy->group = 'State'; // group by state
echo $form->dropDownList($model, 'State', CHtml::listData(Zipcodes::model()->findAll($stateGroupBy), 'State', 'State'),
array('ajax' =>
array(
'type'=>'POST', //request type
'url'=>CController::createUrl('search/dynamiccities'), #we don't have to use search/, we could just say dynamiccities
'update'=>'#Zipcodes_City',
/*'data'=>'js:jQuery(this).serialize()'*/
),
'empty'=>'-- Choose State --')
);
我退回到这里,但这显着减少了负荷。