Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PHP加速我的查询_Php_Sql - Fatal编程技术网

用PHP加速我的查询

用PHP加速我的查询,php,sql,Php,Sql,我正在努力加快我创建的网页的速度。我知道问题是我在一个查询中有一个查询。我觉得必须有一种更快的方法来达到同样的效果,但我已经没有想法了。(我第一次尝试加载页面花了45秒,现在我只下载了大约6秒) 我想做的是从表中提取运行率信息。我需要从运行率表中提取正确的启动和结束运行率,但我首先要做的是工作中心ID 我觉得如果桌子布置得再好一点,可能会很困难,但这是我继承的,因此我有点卡住了。我需要从每个工作中心(大约15个)提取一个月的数据,在那里每天可以运行多达4-5次。。。要处理的数据相当多 以下是PH

我正在努力加快我创建的网页的速度。我知道问题是我在一个查询中有一个查询。我觉得必须有一种更快的方法来达到同样的效果,但我已经没有想法了。(我第一次尝试加载页面花了45秒,现在我只下载了大约6秒)

我想做的是从表中提取运行率信息。我需要从运行率表中提取正确的启动和结束运行率,但我首先要做的是工作中心ID

我觉得如果桌子布置得再好一点,可能会很困难,但这是我继承的,因此我有点卡住了。我需要从每个工作中心(大约15个)提取一个月的数据,在那里每天可以运行多达4-5次。。。要处理的数据相当多

以下是PHP代码:

$qtotalStartup = mysql_query("
    SELECT startup.recordID, startup.date, startup.time, runrate.rate AS temRate, runrate.formID  
        FROM jos_a_inproc_startup startup JOIN jos_a_runrate runrate ON startup.recordID = runrate.recordID 
        WHERE startup.workcenterId = $id AND runrate.rate > 0 AND runrate.formID = 1 AND startup.date > DATE_SUB(NOW(), INTERVAL 1 MONTH)") or die(mysql_error());

$totalStartCtr = mysql_num_rows($qtotalStartup);


if ($totalStartCtr > 0) {
while($rtotalStartup = mysql_fetch_assoc($qtotalStartup)) {

        $hours = 0;
        $goalRate = 0;
        $sumHrRR = 0;
        $startDate = 0;
        $startTime = 0;

        $startupNum = $rtotalStartup['recordID'];
        $goalRate = $rtotalStartup['temRate'];
        $startDate = $rtotalStartup['date'];
        $startTime = $rtotalStartup['time'];    
        $startTime = strtotime($startDate . ' ' . $startTime);


//now that we have all of the startup form info, we can move to the end of run information

//this query will retrieve the correct date, time, and ending run rate for us to use with our calculations.
$qtotalEOR = mysql_query("
    SELECT eor.recordID AS eorRec, eor.date, eor.time, eor.startupid, runrate1.rate AS tempRate, runrate1.formID 
        FROM jos_a_inproc_eor eor JOIN jos_a_runrate runrate1 ON eor.recordID = runrate1.recordID 
        WHERE eor.startupid = $startupNum AND runrate1.rate > 0 AND runrate1.formID = 3") or die(mysql_error());

$totalEORCtr = mysql_num_rows($qtotalEOR);

if ($totalEORCtr > 0) {
while($rtotalEOR = mysql_fetch_assoc($qtotalEOR)) {

//reset the accumulator to 0 so we don't get extra 'bad' data.
$sumHrRR = 0;
$newGoalRate = 0;
$lastestDate = 0;
$latestTime = 0;

            $eorNum = $rtotalEOR['eorRec'];
            $latestDate = $rtotalEOR['date'];
            $latestTime = $rtotalEOR['time'];
            $latestTime = strtotime($latestDate . ' ' . $latestTime);
            $sumHrRR= $rtotalEOR['tempRate'];

任何想法都将不胜感激。我知道如果没有更多的信息,可能很难理解我想要表达的意思,所以如果你还需要了解其他的信息,请告诉我。谢谢。

您可以使用Mem缓存技术使其速度更快,并尽可能使查询更简单。。不要检索脚本中未使用的值

您通常将多少记录作为输出处理?这些桌子有多大?你看过索引了吗?你最近分析过(重建过)它们吗

另外,是否使用deflate将数据发送回浏览器?见:

好吧,您可以尝试使用()并在一个查询中只有一个查询,而不是一个查询,这对性能有很大影响。您可以尝试类似的方法,并稍微调整一下:

SELECT
    startup.recordID AS startupRecordID,
    startup.date AS startupDate,
    startup.time AS startupTime,
    runrate.rate,
    runrate.formID,
    eor.recordID AS eorRecordID,
    eor.date AS eorDate,
    eor.time AS eorTime,
    eor.startupid AS eorStartupID
FROM jos_a_inproc_startup startup
    INNER JOIN jos_a_runrate runrate
    ON startup.recordID = runrate.recordID
    INNER JOIN jos_a_inproc_eor eor
    ON startup.recordID = eor.startupid
WHERE
    startup.workcenterId = $id
    AND runrate.rate > 0
    AND runrate.formID = 1
    AND startup.date > DATE_SUB(NOW(), INTERVAL 1 MONTH)

可能可以尝试使用多个
连接,如以下连接:

SELECT startup.recordID, startup.date, startup.time, 
runrate.rate AS temRate, runrate.formID  

-- stuff from second query
eor.recordID AS eorRec, eor.date AS eor_date, 
eor.time AS eor_time, eor.startupid AS eor_startupid, 
runrate1.rate AS eor_tempRate, 
runrate1.formID AS runrate1_formID

FROM jos_a_inproc_startup startup 
JOIN jos_a_runrate runrate ON startup.recordID = runrate.recordID 

-- second query LEFT JOIN
LEFT JOIN jos_a_inproc_eor eor 
    ON eor.startupid = startup.recordID
LEFT JOIN jos_a_runrate runrate1 
    ON eor.recordID = runrate1.recordID 
    AND runrate1.rate > 0 
    AND runrate1.formID = 3

WHERE startup.workcenterId = $id 
    AND runrate.rate > 0 
    AND runrate.formID = 1 
    AND startup.date > DATE_SUB(NOW(), INTERVAL 1 MONTH)
我不知道我是否正确,但我认为您也在用PHP内部的结果进行聚合工作。您可以在数据库中使用
sum()
avg()
groupby
这样的方法来实现。在将较小的结果集从数据库传输到服务器时,您将节省一些时间,并节省在PHP内部循环和聚合的时间。另外,大多数情况下,使用
JOIN
比在循环中使用查询,甚至在查询中使用子查询要快得多


您还应该检查是否在搜索的列上设置了索引。还可以使用
EXPLAIN
检查查询是如何执行的。

PSA:mysql的
EXPLAIN
函数是。不建议编写新代码,因为这样会阻止您将来升级。您是否直接使用EXPLAIN语句在MySQL中分析了您的查询?你有合适的索引吗?我没有。。。我在这家公司才呆了几个月,我继承了很多“坏”做法。我只接触了一个多月的PHP,所以请原谅PHP的错误。。。大多数时候,如果页面加载速度慢,那么数据库查询就是一个问题。这里似乎就是这样。您可能希望隔离查询语句并在MySQL Workbench/PHPMyAdmin中使用MySQL EXPLAIN:我不完全理解您的代码,但您似乎正在循环$qtotalStartup的结果,并在该循环中运行$qtotalEOR。如果那是真的,那就糟糕了。最好只运行一次第二个查询,其中包含第一个查询的值列表。回复有点晚,但谢谢。使用EXPLAIN并在中获取索引实现了这一技巧。但是为了安全起见,为了让服务器更友好,我采纳了你的建议,使用了多个连接。