这段代码表现糟糕

时间:2013-02-04 08:47:56

标签: php mysql performance codeigniter

我正在使用codeigniter和mysql,我正在尝试从mssql服务器获取一些数据并更新到我的系统。它很慢。如果我做错了,请告诉我。

class systemupdate extends MY_Controller{

    function systemupdate() {      
        return parent::MY_Controller();
    }

    function index(){
        $message = '';                                                                                   
        $message = "CRON Information::COMMON INVENTORY SYSTEM: QUANTITY UPDATE FOR TRADE WH STARTED.";
        log_message('info', $message);  
        $this->load->model("cis/sapinventorymodel");
        $objMainResult = $this->sapinventorymodel->FetchDetailsByUnit(420);
        $mainResult = json_decode($objMainResult);
        if((isset($mainResult)) && ($mainResult->results > 0))  
        {
            $this->load->model("cron/systemupdatemodel");
            foreach($mainResult->rows as $main)
            {
                $arrQuantity = '';
                $arrQuantity = $this->systemupdatemodel->FetchTradeWhQuantity($main->number);
                if((isset($arrQuantity)) && (count($arrQuantity) > 0))
                {
                    if((isset($arrQuantity[0]->quantity)) && ($arrQuantity[0]->quantity != NULL)){
                        $objMainResult = $this->sapinventorymodel->SaveTradeWhQuantity($main->a_umber, $main->a_plant,
                                                                                     $main->a_unit,$arrQuantity[0]->quantity);
                    }
                }   
            }
        }
        $message = "CRON Information::COMMON INVENTORY SYSTEM: QUANTITY UPDATE FOR TRADE WH FINSIHED.";
        log_message('info', $message);      
    }   
}   

这是模型

class systemupdatemodel extends MY_Model {

    function systemupdatemodel() {
        parent::__construct();
        $CI->sapData    =   $this->load->database("sapinventory", TRUE);
        $this->sapData  =   &$CI->sapData;
    }

    function FetchTradeWhQuantity($p_intNumber){

        $query = $this->sapData->query("SELECT quantity FROM master1 WHERE NUMBER = '$p_intNumber'");
            if(($query->num_rows() > 0) && ($query->num_rows() == 1)){
                return $query->result();
            }else
            {
                $query1 = $this->sapData->query("SELECT  quantity FROM master2 WHERE EANNUMBER = '$p_intNumber'");
                if(($query1->num_rows() > 0) && ($query1->num_rows() == 1)){
                    return $query1->result();
                }                   
            }                                       
    }
}   

记录总数为7857,这是它的循环次数。 sapinventory 是一个mssql服务器。

1 个答案:

答案 0 :(得分:1)

在这种情况下,

FetchTradeWhQuantitySaveTradeWhQuantity会进行大量的运行。这意味着(可能)每行至少3个mysql查询。如果您考虑通过1或2个大查询来运行此操作,那么您的表现会非常明显。

现在这可能很容易做,或者很难做到。

例如;

function FetchTradeWhQuantity($p_intNumber){ ... }

可能是

function FetchTradeWhQuantity($p_intNumber) {

    $query = $this->sapData->query("

                           SELECT quantity
                           FROM master 1
                           WHERE NUMBER = '{$p_intNumber}'
                           UNION
                           SELECT quantity
                           FROM master2
                           WHERE EANNUMBER = '{$p_intNumber}'

                                   ");

    if ($query->num_rows() == 1)
        return $query->result();

}

但您可以做的最佳事情是通过2-3次来完成所有这些操作。获取所有数据,使用其ID并运行UPDATEINSERT INTO ... ON DUPLICATE KEY UPDATE。然后服务器只需连接几次mysql数据库,就不必为每个小行用php弹奏弹球。