while 循环加载时间过长

Posted

技术标签:

【中文标题】while 循环加载时间过长【英文标题】:while loop taking too long to load 【发布时间】:2021-04-27 06:44:50 【问题描述】:

我在加载时间方面遇到问题。我尝试删除第一个 if-else 语句,它运行得非常快,但添加回来时却不行。我的表中有超过 40000 行。

while ($qry->fetch())
    $form .= "
        <div class='formSections' id='formSections-$formSectionCounter'>
        <h4 style='text-align: center; color: white; width: 100%; font-size: 20px; margin: 10px auto;'>$sname</h4>
    ";

    $qry2 = $con->prepare("SELECT FieldId, FieldName, FieldType, FieldFilter, DisplaySubSection from qrp.agency_webform_section_fields where SectionId = ? ORDER BY FieldOrder ASC");
    // $response_array['data'] .= $con->error;
    $qry2->bind_param("s", $sid);
    $qry2->execute();
    $qry2->store_result();
    if ($qry2->num_rows > 0)
    
        $qry2->bind_result($fid, $fname, $ftype, $ffilter, $DisplaySubSection);
        while ($qry2->fetch())
        

            if($DisplaySubSection != '')
                $form .= "
                    <h4 style='text-align: center; color: white; width: 100%; font-size: 20px; margin: 10px auto;'>$DisplaySubSection</h4>
                ";
            

            unset($defval);
            unset($dov);
            unset($doid);
            unset($iof);
            unset($reqf);
            $qry3 = $con->prepare("SELECT DefaultValue,IncludeOnForm,Required from qrp.agency_webform_fields where WebformId = ? and FieldId = ?");
            $qry3->bind_param("ss", $wfid, $fid);
            $qry3->execute();
            $qry3->store_result();
            if ($qry3->num_rows > 0)
            
                //FOUND FIELD IN Webform
                $qry3->bind_result($defval, $iof, $reqf);
                $qry3->fetch();
                if ($defval != '')
                
                    $qry4 = $con->prepare("SELECT OptionValue,OptionId from qrp.agency_webform_field_options where OptionId = ?");
                    $qry4->bind_param("s", $defval);
                    $qry4->execute();
                    $qry4->store_result();
                    if ($qry4->num_rows > 0)
                    
                        $qry4->bind_result($dov, $doid);
                        $qry4->fetch();
                    
                    else
                    
                        $dov = $defval;
                    

                
            

            $form .= "
                <div class='BothinputsAndLabelsAndCheckbox'>
                <div class='inputsAndLabels'>
                    <label>$fname</label>";
                    if ($ftype == 'String' || $ftype == 'INT')
                        $form .= "
                            <input name='$fid-default' id='$fid-default' type='text' class='' value='$dov' data-toggle='tooltip' data-placement='top' title='If you set an answer here, it will be the default value in the form'>
                        ";
                     else if ($ftype == 'Date')
                        $date = date('Y-m-d', strtotime($dov));
                        $form .= "
                            <input name='$fid-default' id='$fid-default' type='date' class='' value='$date' data-toggle='tooltip' data-placement='top' title='If you set an answer here, it will be the default value in the form'>
                        ";
                     else if ($ftype == 'Checkbox')
                        $form .= "
                            <input name='$fid-default' id='$fid-default' type='checkbox' class='' value='$dov' data-toggle='tooltip' data-placement='top' title='If you set an answer here, it will be the default value in the form'>
                        ";
                     else if ($ftype == 'SelectList')
                        $form .= "
                        <select name='$fid-default' id='$fid-default' class='' data-toggle='tooltip' data-placement='top' title='If you set an answer here, it will be the default value in the form'>";
                            $qry3 = $con->prepare("SELECT OptionValue,OptionId,FieldFilterId from qrp.agency_webform_field_options where FieldId = ? Order By OptionValue");
                            $qry3->bind_param("s", $fid);
                            $qry3->execute();
                            $qry3->store_result();
                            $form .= "<option value=''>Please Select an Option</option>";
                            if ($qry3->num_rows > 0)
                            
                                $qry3->bind_result($optv, $optid, $filid);
                                while ($qry3->fetch())
                                
                                    if (!isset($defval))
                                    
                                        $form .= "<option value='$optid' id='$filid' class='$filid'>$optv</option>";
                                    
                                    else
                                    
                                        if ($doid == $optid)
                                        
                                            $form .= "<option value='$optid' id='$filid' class='$filid' selected>$optv</option>";
        
                                        
                                        else
                                        
                                            $form .= "<option value='$optid' id='$filid' class='$filid'>$optv</option>";
        
                                        
                                    
                                
                            
                            $form .= "                          
                        </select>
                        ";
                    
                    $form .= "
                </div>"; // end inputsAndLabels div
                    $form .= "
                        <div class=''>
                            <div class='includeDiv'>
                                <input type='checkbox' class='includeButton' id='$fid-include' data-value='$fid' name='$fid-include' "; if ($iof > 0) $form .= " checked"; $form .= " data-toggle='tooltip' data-placement='top' title='If you set an answer here, it will be the default value in the form'>
                                <label class='' for='$fid-include'> Include</label>
                            </div>";
                            if ($ftype != 'Checkbox')
                                $form .= "
                                <div class='requiredDiv'>
                                    <input type='checkbox' class=' requiredButton' id='$fid-required' data-value='$fid' name='$fid-required' "; if ($reqf > 0) $form .= " checked"; $form .= " data-toggle='tooltip' data-placement='top' title='If you set an answer here, it will be the default value in the form'>
                                    <label class='' for='$fid-required'> Require </label>
                                </div>
                                ";
                            
                            $form .= "
                        </div>
            </div>
            ";
        
    
    $form .= "
    </div> <!-- close formSections -->
    ";

    $formSectionCounter++;

【问题讨论】:

如果这适用于您的应用程序,可以尝试分页数据 您有三个嵌套循环,每个循环遍历一个结果集并调用您的数据库。首先要做的是整理您的查询,以便您在一个查询中获取所有数据并对其进行迭代以构建您的页面。 【参考方案1】:

如果您正在执行超过 40000 行的循环,这基本上不是问题。如果您为每个提取的行准备一个新的 SQL 语句来为每个行 ID 选择相关信息,那么问题就开始了。在您的示例中,您在后续 SQL 选择、新的选择语句中创建的行数至少是 40000 倍,这会减慢页面加载速度

您可以通过使用左连接或子选择扩展您的第一个 SQL 语句以在一次 SQL 提取迭代中获取所有数据来解决此问题。

我建议将您的结果保存到数组中。不要混淆 SQL 准备和 html 标记。这使代码更加简洁,并且一旦您将优化 SQL 的数据放入数组中,您就可以更好地搜索问题。像往常一样使用嵌套循环创建您的 HTML 标记,但在这些循环中访问您的数组,您已经预先填充了数据库中的数据。

【讨论】:

另外:格式化您的 SQL 查询以增加可读性,并为 $ftype 而不是 if-else 切换大小写。并使用 Code Formatter 正确格式化您的代码!如果使用 Visual Code,请使用 marketplace.visualstudio.com/… 我知道,这些是很多重要的建议,但优化从干净的代码格式开始。让您自己和任何审查您的代码的人尽可能轻松:D 感谢您抽出宝贵时间回答! 不客气!不要犹豫,寻求您需要的帮助:D

以上是关于while 循环加载时间过长的主要内容,如果未能解决你的问题,请参考以下文章

使用 do while 循环加载背景

Braintree 一次性付款请求加载时间过长

BigQuery 从 Android 加载数据的时间过长

hook orm 加载时间过长

在 IE 中引导选择加载时间过长

Firebase Storage Flutter 显示图像加载时间过长