繁体   English   中英

MySQL和PHP提高性能

[英]MySQL and PHP increase performance

我得到了可以使用的代码,并且我希望加快代码的速度。 这一点浪费了该页面的加载时间,并浪费了服务器资源。 有任何想法吗?

$Actv = 0;
$ActvCount = -1;
$ActvUpgrade = 0;
$ActvRenewal = 0;
$ActvVehicleAdds = 0;
$renewalCount = 0;
$result2 = mysql_query("SELECT OperatorID, Username 
FROM tblOperators 
WHERE OperatorLocale='USA' AND 
OperatorStatus='ACTIVE'");

while($row2 = mysql_fetch_array($result2)) {
 $operID = $row2['OperatorID'];
 $operName = $row2['Username'];
 $result = mysql_query("SELECT PaymentReason, 
 PaymentMethod, 
 ChargeAmount, 
 UserID, 
 PaymentDate, 
 PackageID 
 FROM tblUserPayments 
 WHERE OperatorID = '$operID' AND 
 PaymentStatus='OK' AND 
 PaymentDate LIKE '$currentDate%'"
);

while($row = mysql_fetch_array($result)) {
  if($row['PaymentReason'] == 'ACTIVATION') {
    ++$ActvCount;
    if($row['PaymentMethod'] == 'CREDITCARD' || $row['PaymentMethod'] == 'PAPERCHECK') {
        $ActvUpgrade += $row['ChargeAmount'];
    }
}
elseif($row['PaymentReason'] == 'UPGRADE') {
    $userid = $row['UserID'];
    $paymentdate = $row['PaymentDate'];
    $result1 = mysql_query("SELECT DueDate FROM tblRenewalInvoices WHERE UserID='$userid' AND ('$paymentdate' >= DATE_SUB(DueDate, INTERVAL 90 DAY) AND '$paymentdate' < DATE_ADD(DueDate, INTERVAL 15 DAY)) AND ParentInvoiceID IS NULL ORDER BY InvoiceNum DESC LIMIT 1");
    if($row1 = mysql_fetch_array($result1)) {
        $packageid = $row['PackageID'];
        $pack = mysql_query("SELECT ExpirationDate, Package FROM tblUserPackages WHERE PackageID='$packageid';");
        if($pack1 = mysql_fetch_array($pack)) {
            $expDate = $pack1['ExpirationDate'];
            $dueDate = $row1['DueDate'];
            $days = mysql_fetch_row(mysql_query("SELECT TO_DAYS('$expDate')-TO_DAYS('$dueDate');"));
            $months = (int)( ((int)$days + 14) / 30.4);
            $years = (int) ( ((int)$days + 182) / 365);
            $Intervals = 0;
            if($years > 0){
                $Intervals = $years;
            } if(($pack1['Package'] or 'GPS-SVL') or ($pack1['Package'] == 'GPS-1') or ($pack1['Package'] == 'GPS-1PLUS')) {
                if($Intervals > 1){
                    if($row['PaymentMethod'] == 'CREDITCARD' || $row['PaymentMethod'] == 'PAPERCHECK') {
                        ++$renewalCount;
                        $Actv += $row['ChargeAmount'];
                    }
                } else{
                    if($row['PaymentMethod'] == 'CREDITCARD' || $row['PaymentMethod'] == 'PAPERCHECK') {
                        ++$renewalCount;
                        $ActvRenewal += $row['ChargeAmount'];
                    }
                }
            } else {
                ++$renewalCount;
                $Actv += $row['ChargeAmount'];
            }
        } else {
        }
    }   else {
        if($row['PaymentMethod'] == 'CREDITCARD' || $row['PaymentMethod'] == 'PAPERCHECK')
            $ActvUpgrade += $row['ChargeAmount'];
    }
} elseif($row['PaymentReason'] == 'ADDVEHICLE') {
    if($row['PaymentMethod'] == 'CREDITCARD' || $row['PaymentMethod'] == 'PAPERCHECK')
        $ActvVehicleAdds += $row['ChargeAmount'];
}
}

$result = mysql_query("SELECT Charged, RenewYears, RenewTotal FROM tblRenewalCalls WHERE OperatorID = '$operID' AND PayStatus='OK' AND DateSubmitted LIKE '$currentDate%'");

 while($row = mysql_fetch_array($result)) {
  if($row['Charged']) {
    if ((int)$row['RenewYears'] > 1) {
        ++$renewalCount;
        $Actv += $row['RenewTotal'];
    } else {
        ++$renewalCount;
        $ActvRenewal += $row['RenewTotal'];
    }
}
}
}

if($ActvCount != 0) {
 $PerActv = ($ActvUpgrade+$ActvVehicleAdds) / $ActvCount;
} else {
 $PerActv = 0;
}

$total = $Actv+$ActvRenewal+$ActvUpgrade+$ActvVehicleAdds;

# Fix to show proper renewal dollars
$ActvRenewal = $total - ($ActvVehicleAdds + $ActvUpgrade);

$AvgRenewal = ($ActvRenewal) / $renewalCount;

$upgradeEarned = $ActvUpgrade;
$renewalEarned = $ActvRenewal;

到目前为止,这是我的代码,但是我不知道从这里开始,因为我还没有MySQL的经验。 任何帮助是极大的赞赏。

SELECT o.OperatorID AS OperatorID, o.Username AS Username, 
    up.PaymentReason AS PaymentReason, up.PaymentMethod AS PaymentMethod,
    up.ChargeAmount AS ChargeAmount, up.UserID AS UserID, 
    up.PaymentDate AS PaymentDate, up.PackageID AS PackageID,
    rc.Charged AS Charged, rc.RenewYears AS RenewYears,
    rc.RenewTotal AS RenewTotal, p.ExpirationDate AS ExpirationDate, 
    p.Package AS Package
FROM tblOperators o
    JOIN tblUserPayments up ON up.OperatorID = o.OperatorID
    JOIN tblRenewalCalls rc ON o.OperatorID = rc.OperatorID
    JOIN tblRenewalInvoices i ON up.UserID = i.UserID
    JOIN tblUserPackages p ON up.PackageID = p.PackageID
WHERE (o.OperatorLocale='USA' AND o.OperatorStatus='ACTIVE') AND
    (up.PaymentStatus = 'OK' AND up.PaymentDate LIKE '$currentDate%') AND
    (rc.PayStatus = 'OK' AND rc.DateSubmitted LIKE '$currentDate%')

快速播放,我认为您可以轻松合并第一选择和第二选择。 与第3个查询和第4个查询相同,在这种情况下,第5个查询(从这些查询中获得几个日期之间的差异)可以轻松地合并。

未经测试,但类似这样:-

<?php 

$Actv = 0;
$ActvCount = -1;
$ActvUpgrade = 0;
$ActvRenewal = 0;
$ActvVehicleAdds = 0;
$renewalCount = 0;

$prev_operID = null;

$result = mysql_query("SELECT tblOperators.OperatorID,
                                tblUserPayments.PaymentReason, 
                                tblUserPayments.PaymentMethod, 
                                tblUserPayments.ChargeAmount, 
                                tblUserPayments.UserID, 
                                tblUserPayments.PaymentDate, 
                                tblUserPayments.PackageID 
                        FROM tblOperators
                        INNER JOIN tblUserPayments 
                        ON  tblOperators.OperatorID = tblUserPayments.OperatorID  
                        WHERE tblOperators.OperatorLocale='USA' 
                        AND tblOperators.OperatorStatus='ACTIVE'
                        AND tblUserPayments.PaymentStatus='OK' 
                        AND tblUserPayments.PaymentDate LIKE '$currentDate%'"
);

while($row = mysql_fetch_array($result)) 
{
    if($row['PaymentReason'] == 'ACTIVATION') 
    {
        ++$ActvCount;
        if($row['PaymentMethod'] == 'CREDITCARD' || $row['PaymentMethod'] == 'PAPERCHECK') 
        {
            $ActvUpgrade += $row['ChargeAmount'];
        }
    }
    elseif($row['PaymentReason'] == 'UPGRADE') 
    {
        $userid = $row['UserID'];
        $paymentdate = $row['PaymentDate'];
        $result1 = mysql_query("SELECT tblRenewalInvoices.DueDate 
                                        tblUserPackages.ExpirationDate, 
                                        tblUserPackages.Package,
                                        tblUserPackages.PackageID,
                                        TO_DAYS(IFNULL(tblUserPackages.ExpirationDate, 0)) - TO_DAYS(tblRenewalInvoices.DueDate) AS days_diff
                                FROM tblRenewalInvoices 
                                LEFT OUTER JOIN tblUserPackages
                                ON tblUserPackages.PackageID  = tblRenewalInvoices.PackageID
                                WHERE UserID='$userid' 
                                AND ('$paymentdate' >= DATE_SUB(DueDate, INTERVAL 90 DAY) 
                                AND '$paymentdate' < DATE_ADD(DueDate, INTERVAL 15 DAY)) 
                                AND ParentInvoiceID IS NULL 
                                ORDER BY InvoiceNum DESC LIMIT 1");
        if($row1 = mysql_fetch_array($result1)) 
        {
            if($row1['PackageID'] != '') 
            {
                $expDate = $row1['ExpirationDate'];
                $dueDate = $row1['DueDate'];
                $days = $row1['days_diff'];
                $months = (int)( ((int)$days + 14) / 30.4);
                $years = (int) ( ((int)$days + 182) / 365);
                $Intervals = 0;
                if($years > 0)
                {
                    $Intervals = $years;
                } 
                if(($row1['Package'] or 'GPS-SVL') or ($row1['Package'] == 'GPS-1') or ($row1['Package'] == 'GPS-1PLUS')) 
                {
                    if($Intervals > 1)
                    {
                        if($row['PaymentMethod'] == 'CREDITCARD' || $row['PaymentMethod'] == 'PAPERCHECK') 
                        {
                            ++$renewalCount;
                            $Actv += $row['ChargeAmount'];
                        }
                    } 
                    else
                    {
                        if($row['PaymentMethod'] == 'CREDITCARD' || $row['PaymentMethod'] == 'PAPERCHECK') 
                        {
                            ++$renewalCount;
                            $ActvRenewal += $row['ChargeAmount'];
                        }
                    }
                } 
                else 
                {
                    ++$renewalCount;
                    $Actv += $row['ChargeAmount'];
                }
            } 
            else 
            {
            }
        }   
        else 
        {
            if($row['PaymentMethod'] == 'CREDITCARD' || $row['PaymentMethod'] == 'PAPERCHECK')
            $ActvUpgrade += $row['ChargeAmount'];
        }
    } 
    elseif($row['PaymentReason'] == 'ADDVEHICLE') 
    {
        if($row['PaymentMethod'] == 'CREDITCARD' || $row['PaymentMethod'] == 'PAPERCHECK')
        $ActvVehicleAdds += $row['ChargeAmount'];
    }
    if ($prev_operID != $row['OperatorID'])
    {
        $result = mysql_query("SELECT Charged, RenewYears, RenewTotal FROM tblRenewalCalls WHERE OperatorID = '".$row['OperatorID']."' AND PayStatus='OK' AND DateSubmitted LIKE '$currentDate%'");

        while($row = mysql_fetch_array($result)) 
        {
            if($row['Charged']) 
            {
                if ((int)$row['RenewYears'] > 1) 
                {
                    ++$renewalCount;
                    $Actv += $row['RenewTotal'];
                } 
                else 
                {
                    ++$renewalCount;
                    $ActvRenewal += $row['RenewTotal'];
                }
            }
        }
        $prev_operID = $row['OperatorID'];
    }
}

if($ActvCount != 0) 
{
    $PerActv = ($ActvUpgrade+$ActvVehicleAdds) / $ActvCount;
} 
else 
{
    $PerActv = 0;
}

$total = $Actv+$ActvRenewal+$ActvUpgrade+$ActvVehicleAdds;

# Fix to show proper renewal dollars
$ActvRenewal = $total - ($ActvVehicleAdds + $ActvUpgrade);

$AvgRenewal = ($ActvRenewal) / $renewalCount;

$upgradeEarned = $ActvUpgrade;
$renewalEarned = $ActvRenewal;

最后选择有点奇怪。 也许可以稍加思考就将其合并。 一旦使用了运算符ID的内置IN子句,也可以只执行一次,在这种情况下,您应该能够直接在SQL中获得汇总的值,而不是在php中将其相加。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM