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

标签 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

为了得到左树和右树的总奖金,我应该分别找到所有 child 的奖金。所以我需要检查 children 的情况。我有一个逻辑,它适用于较小的数据,但随着数据的增加,执行 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{

            }
        }

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

最佳答案

我对你的数据结构了解不多。尽管如此,我还是建议使用连接并在存储过程/ View 的帮助下将其从 Codeigniter 中取出(我更喜欢您的情况下的 View )。使用它,您还可以消除复杂性并提高性能

关于php - 如何减少使用PHP和MySQL对海量数据执行某些操作所需的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47562499/

相关文章:

php - Laravel 中的 Blade 模板与纯 PHP

Javascript 自增数组

php - 使用Codeigniter将视频远程上传到youtube

c# - 外键关系不会出现在带有 mysql 数据库的 edmx 中,带有带有数据库的 asp mvc

php - 如何使用 MySQL 中的数据在 Gmail 中发送消息(格式化消息)

php - 如何在 codeigniter 3 中使用 PDO

php - 当我在查询中使用 Union All 时,Codeigniter 返回 0 结果

php proc_open 如何检测命令是否完成/proc_open() 至少需要 3 个参数

php - 如何使用 php 从 mysql 中的单个表中获取所有数据?

php - CodeIgniter 无法正确访问 if...else 语句中的变量