Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.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 在while循环中进行查询,如何提高查询速度?两种数据库类型_Php_Mysql_Postgresql - Fatal编程技术网

Php 在while循环中进行查询,如何提高查询速度?两种数据库类型

Php 在while循环中进行查询,如何提高查询速度?两种数据库类型,php,mysql,postgresql,Php,Mysql,Postgresql,编辑 我想我需要添加更多信息。第一个查询是MySQL,后两个是PGSQL,它位于一个单独的服务器上。当我在本文第二部分中禁用第二个查询时,它仍然很慢 SELECT n.id, n.number, n.assigned, n.btn, n.status as stat, s.status FROM numbers n LEFT JOIN status s on n.status=s.id where number like '239333%' LIMIT $start, $limit 我有

编辑 我想我需要添加更多信息。第一个查询是MySQL,后两个是PGSQL,它位于一个单独的服务器上。当我在本文第二部分中禁用第二个查询时,它仍然很慢

SELECT n.id, n.number, n.assigned, n.btn, n.status as stat, s.status 
FROM numbers n 
LEFT JOIN status s on n.status=s.id 
where number like '239333%'
LIMIT $start, $limit
我有下面的查询,它从数据库中提取一系列数字,这是一个非常快速的查询,因为我将它限制为50或100

这将在PHP中的while循环中列出输出

在这个while循环中,有一个到独立服务器(postgres)的第二个连接,通过一个函数对这个数字进行额外的检查,因此在循环中我有例如$mq=addition\u checks($number)


是它调用以执行上面列出的附加postgres检查的函数。是的,我的代码很难看,我还是个笨蛋。:)

研究在两个表上使用
连接
。然后,您可以比较速度,但取决于您拥有的行数,
JOIN
应该比两个查询更快

研究在两个表上使用
连接
。然后,您可以比较速度,但取决于您拥有的行数,
JOIN
应该比两个查询更快

可以避免循环中的SQL查询。一种方法是收集php数组中的所有$number,然后在循环后运行单个查询

。其中baseinformation\u directorynumber为($num1,$num2,…)

您将在一次尝试中获得所有数字的计数。这将加快执行速度


我发现了一篇博文,其中包含了更多避免循环中sql的方法

可以避免循环中的SQL查询。一种方法是收集php数组中的所有$number,然后在循环后运行单个查询

。其中baseinformation\u directorynumber为($num1,$num2,…)

您将在一次尝试中获得所有数字的计数。这将加快执行速度



我发现了一篇博文,其中包含了更多避免循环中sql的方法

pg_免费_结果($result);这不是MYSQL。主要的第一个查询是MYSQL,下面两个额外检查的查询是postgres。我知道这是一团糟pg_免费_结果($result);这不是MYSQL。主要的第一个查询是MYSQL,下面两个额外检查的查询是postgres。我知道这是一团糟这是你最好的选择。如果您仍然不满意,请尝试创建一个存储过程。如果这两个存储过程位于同一台服务器上,并且数据库类型相同,则这不会有问题。:)没有提到您在不同的服务器上有这些,而且它似乎没有改变您上面的查询。。。如果上面的代码与PHP文件中的代码完全相同,那么使用联接就可以了。我的意思是联接第一个查询&循环中的一个-这是PHP代码中的两个查询,而不是原始的裸SQL查询。好的,我将标题编辑得更具体,对此表示抱歉。即使没有postgres端的第二个查询,它仍然非常慢。不过我会考虑加入他们,看看是否有帮助。这是你最好的选择。如果您仍然不满意,请尝试创建一个存储过程。如果这两个存储过程位于同一台服务器上,并且数据库类型相同,则这不会有问题。:)没有提到您在不同的服务器上有这些,而且它似乎没有改变您上面的查询。。。如果上面的代码与PHP文件中的代码完全相同,那么使用联接就可以了。我的意思是联接第一个查询&循环中的一个-这是PHP代码中的两个查询,而不是原始的裸SQL查询。好的,我将标题编辑得更具体,对此表示抱歉。即使没有postgres端的第二个查询,它仍然非常慢。不过,我会考虑加入其中,看看它是否有帮助。我感到困惑的是,我在构建一个变量时,它会循环。在每个循环上,它检查加法_checks(),然后当它从中返回时,有两个if/then为该1结果的输出着色。我不明白在查询运行后我怎么还能做到这一点,但我知道这将极大地缩短查询时间。你可以更新函数
addition\u checks($number)
接受数字数组
加法检查($numbers)
然后使用(…此处的数字)
在sql查询中传递数字。对输出运行foreach并收集count=0的数字,然后使用
语法中相同的
对这些数字运行第二次查询。我可以理解此函数中有关输出着色的部分。也许你们也可以收集所有由$number临时键入的输出,然后在循环后更新这些输出。我搞不清楚的是,我在循环时构建了一个变量。在每个循环上,它检查加法_checks(),然后当它从中返回时,有两个if/then为该1结果的输出着色。我不明白在查询运行后我怎么还能做到这一点,但我知道这将极大地缩短查询时间。你可以更新函数
addition\u checks($number)
接受数字数组
加法检查($numbers)
然后使用(…此处的数字)
在sql查询中传递数字。对输出运行foreach并收集count=0的数字,然后使用
语法中相同的
对这些数字运行第二次查询。我可以理解此函数中有关输出着色的部分。也许您还可以收集所有由$number临时键入的输出,然后在循环后更新这些输出。
$query = "SELECT count(baseinformation_directorynumber) as count FROM \"public\".\"meta_subscriber\" WHERE baseinformation_directorynumber = $number";
$result = pg_query($query) or die('Query failed: ' . pg_last_error());
$row = pg_fetch_assoc($result);
$did = "0";
if ($row['count'] == '0') {
    $query2 = "SELECT count(lastdirectorynumber) as count FROM \"public\".\"meta_pbx_directinwardcalling\" where firstdirectorynumber <= $number and $number <= lastdirectorynumber";
    $result2 = pg_query($query2) or die('Query failed: ' . pg_last_error());
    $row2 = pg_fetch_assoc($result2);
    if ($row2['count'] == '1') { 
        $did = $row2['count'];
        $row['count'] = "0";
    }

}

pg_free_result($result);

// Closing connection

$line = $row['count'];
$match = array('line' => $line, 'did' =>  $did);
return $match;
while ($q->getrow()) {
$number = $q->field('number'); $assigned = $q->field('assigned'); $btn = $q->field('btn'); $id = $q->field('id'); $status = $q->field('status'); $stat = $q->field('stat');
$nc++; //Start Counter
$now = time(); 
$diff = $now - $time; 
if ($alternate == "1") {
    $color = "#EFEFEF";
    $alternate = "2";
} else {
    $color = "#DFDFDF";
    $alternate = "1";
}
$match = meta_query($q->field('number'));
if ($match['line'] == '1' and $match['did'] == '0') { 
    $numcolor = "green";
    $did = "";
} elseif ($match['did'] == '1' AND $match['line'] == '0') { 
    $did = "[DID]"; 
    $numcolor = "green";
} else {
    $did = "";
    if ((!$assigned) AND (!$btn) AND ($stat == '1' OR $stat == '4')) {
        $numcolor = "";
    } else {
        $numcolor = "red";
    }

}
//if ($numcolor = "red" AND $assigned == '' AND $btn == '' AND $stat == '1') {
//  $numcolor = "";
//}
//print_r($match);
if ($stat == '4') { $color = "C2FACB"; }
elseif ($stat == '2') { $color="FCFBEA"; }
// else {
$ajaxedits .= "EditInPlace.makeEditable({ id: 'btn:$id' });\n";
$ajaxedits .= "EditInPlace.makeEditable({ id: 'assigned:$id' });\n";
$ajaxedits .= "EditInPlace.makeEditable({
    id: 'status:$id',
    type: 'select',
    save_url: 'optionedit_eip.php',
    options: {
        1: 'Free',
        2: 'In use',
        3: 'Disconnected',
        4: 'Ported Out'
    }
});";
//}
//<span class="red" id="status:$id">Dark Green</span>
//
if (isset($right[admin])) {
     $clear = "<a href=\"index.php?a=clearrow&id=$id\"> (Clear)</a>";
}   
eval("\$list_numbers .= \"".addslashes($TI[5])."\";");
}
$q->free;
$match = meta_query($q->field('number'));