如何使用PHP和MySQL减少对大量数据执行某些操作所需的时间?

时间:2017-11-29 21:54:40

标签: php mysql codeigniter

我的数据库中有200000多行数据,我想要用其他行检查每行的数据并执行某些操作并显示结果。

假设考虑下表(树数据): p_teams

id  name  parentname  placedunder   position  

1    x       root         root         root    

2    y        x             x          left    

3    z        x             x          right  

4    a        x             y          left    

5    b        z             z          right 

等......

奖金表包含姓名和奖金。

示例:

name bonus 
 x     10
 y     20

要获得左右树的总奖金,我应该分别找到所有孩子的奖金。所以我需要检查childerns。我有一个逻辑,它适用于较小的数据,但随着数据的增加,执行PHP函数所需的时间也在增加。

这里的逻辑(我使用过codeigniter):

function getBous($name){
            $data = array('name'=>$name);
            $res = $this->db->get_where('p_teams',$data);
            if($res->num_rows()>0){
                $data = array('parentname'=>$name);
                $this->db->select('name,position');
                $res = $this->db->get_where('p_teams',$data);
                if($res->num_rows()>0){
                    $row = $res->result_array();
                    $i = 0;
                    $temp = array();
                    $temp1 = array();
                    foreach($row as $parent){
                        $temp[$i] = $parent['name'];
                        $position[$i] = $parent['position'];
                        $i = $i+1;
                    }
                    $abonus = 0;
                    $bbonus = 0;
                    while(sizeof($temp) != 0 && sizeof($position) != 0){
                        $data = array('name'=>$temp[0]);
                        $this->db->select('bonus');
                        $res = $this->db->get_where('bonus',$data);
                        if($res->num_rows()>0){
                            $row = $res->row_array();
                            $bonus = $row['bonus'];
                        }
                        else{
                            $bonus = 0;
                        }
                        if($position[0] === "left"){
                            $abonus = $abonus + $bonus;
                        }
                        else if($position[0] === "right"){
                            $bbonus = $bbonus + $bonus;
                        }
                        $data = array('parentname'=>$temp[0]);
                        $this->db->select('name,position');
                        $res = $this->db->get_where('p_teams',$data);
                        if($res->num_rows()>0){
                            $row = $res->result_array();
                            $i=0;
                            foreach($row as $parent){
                                $temp1[$i] = $parent['name'];
                                $position1[$i] = $parent['position'];
                                $i = $i+1;
                            }
                            $temp = array_merge($temp,$temp1);
                            $position = array_merge($position,$position1);
                        }
                        else{

                        }
                        unset($temp[0],$position[0]);
                        $temp = array_values($temp);
                        $position = array_values($position);
                        echo "<pre>";
                        echo "abonus:".$abonus." bbonus:".$bbonus." name:".$temp[0];
                        echo "</pre>";
                    }
                }
            }
            else{

            }
        }

那么,解决此类问题的最佳方法是什么以及如何处理大量数据?

1 个答案:

答案 0 :(得分:1)

我对您的数据结构知之甚少。我仍然建议使用连接并在存储过程/视图的帮助下将其从Codeigniter中取出(我更喜欢在您的情况下使用视图)。使用它,您还可以消除复杂性并提高性能