使用大型数据库时,Ajax请求需要很长时间才能完成

时间:2015-09-17 09:02:49

标签: php jquery mysql ajax yii

我正在使用 Yii框架(版本1.1.14)编写的网站,该网站允许上传和显示新闻。网站的管理员可以选择三个新闻来推广到主页并指定它们的显示顺序。我正在使用 Mysql 数据库。 新闻表除了其他字段外还有两个字段: isChecked (0或1)和 homepagePos (整数)。 isChecked 字段确定是否选择在主页中显示新闻, homepagePos 字段确定新闻的显示顺序。我使用了jquery的可排序插件来对新闻进行排序。当用户选择要显示的新闻并单击“保存”按钮时,新闻ID将通过ajax发送到php。

将值发送到新闻控制器的javascript部分如下:

$(document).on('click', '#saveToHomepage', function() 
{
    var url = ajaxRequestSendUrl;   //ajaxRequestSendUrl contains url to news controller's promote to homepage method.
    $.ajax({
        method: "GET",
        url: url,
        data: {
            contentIds: contentIds, //contentIds contains an array of news Ids in certain order
            },
        success: function() {
        // Show success message
        },
        error: function() {
            alert('Some error occured. Please reload the page and try again.');
        }
    });
});

这是新闻控制器中的主页推广方法:

public function actionHomepage()
{
    $allNews = News::model()->findAll();
    $value = $_GET['contentIds'];
    foreach ($allNews as $news) {
        if($news->id == $value[0] ||$news->id == $value[1] ||$news->id == $value[2])
        {
            $news->isChecked = 1;
            $news->homepagePos = array_search($news->id, $value); //Assign index of the array as the position
            $news->save();
        }
        else
        {
            $news->isChecked = 0;
            $news->homepagePos = -1;
            $news->save();
        }
    }
}

我的问题是我的新闻表有超过2k的数据。所以ajax调用需要很长时间(超过一分钟)才能完成。有什么方法可以优化代码,还是有其他方法可以解决这个问题,以减少完成此操作所需的时间? 提前致谢

3 个答案:

答案 0 :(得分:0)

我不确定,但为什么不通过发送所选新闻的ID来从数据库本身获取过滤后的记录。我不知道你的后端语言。好像,您正在获取所有记录并应用过滤。这耗费时间。而是从数据库中获取过滤后的新闻。

希望这有帮助!

答案 1 :(得分:0)

它需要很长时间,因为您正在获取所有记录,然后更新这三个id。你可以试试这个:

$criteria = new CDbCriteria;
$criteria->addInCondition( "id" , $value ) ; // $value = array ( 1, 2, 3 );
News::model()->updateAll(array('isChecked'=>'1','homepagePos'=>'val2'), $criteria);

您可以事先进行更新以重置所有homepagePos,然后仅更新您需要的ID。

答案 2 :(得分:0)

三个查询:首先将整个表设置为未检查状态,其余设置仅在每个选中的行中设置检查状态

>>> import cmath
>>> cmath.log(0 - 99 + 1, 2)
(6.614709844115209+4.532360141827194j)