首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于100 k行查询,PHP最大执行时间超过30秒

对于100 k行查询,PHP最大执行时间超过30秒
EN

Stack Overflow用户
提问于 2015-08-26 08:04:22
回答 1查看 787关注 0票数 0

是否可以编写php代码,该代码将获取序列化数据、取消序列化并在新的数据库架构上写入内容而没有

ini_set("max_execution_time",0);

我想我已经优化了我的代码,但这是无法避免的。

我在迭代中使用以下代码。

代码语言:javascript
复制
$queryCount ="SELECT count(*) FROM APPLICATION where PRO_UID='$PRO_UID' 
                AND APP_STATUS != 'DRAFT' 
                AND APP_STATUS != 'CANCELLED'";
    $resultCount = $mysqli->query($queryCount);
    $count = (mysqli_fetch_array($resultCount));

    for($x=0;$x < $count; $x += 1000){


        $queryData = "SELECT * FROM wf_workflow.APPLICATION 
                        where PRO_UID='$PRO_UID' 
                        AND APP_STATUS != 'CANCELLED' 
                        AND APP_STATUS != 'DRAFT' 
                        not in (SELECT APP_NUMBER FROM export_workflow.CARDS_CONTACT_DETAILS_LOOKUP) LIMIT 2000";


        $resultData = $mysqli->query($queryData);

        while($row = mysqli_fetch_array($resultData)){

            $data = unserialize($row['APP_DATA']);
            $APP_NUMBER = $row['APP_NUMBER'];
            $PERSON_NAME = $data["PersonalInformation"][1]["FirstName"] . " " . $data["PersonalInformation"][1]["MiddleName"] ." " . $data["PersonalInformation"][1]["LastName"];
            $MOBILE = $data["ContactDetails"][1]["MobileNo"];
            $OFFICE_PHONE = $data["EmploymentInformation"][1]["OfficeTelNo"];
            $HOME_PHONE = $data["ContactDetails"][1]["TelephoneNo1"];

            $sql = "INSERT INTO CARDS_CONTACT_DETAILS_LOOKUP (APP_NUMBER , HOME_PHONE , MOBILE , OFFICE_PHONE, PERSON_NAME)
                    VALUES ('$APP_NUMBER' , '$HOME_PHONE' , '$MOBILE' , '$OFFICE_PHONE' , '$PERSON_NAME')";

            if (mysqli_query($mysqli, $sql)) {
                echo "New record created successfully FROM dev";
            } else {
                echo "Error: " . $sql . "<br>" . mysqli_error($mysqli);
            }

        }

    echo "finished the dev";

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-26 10:24:32

第一个查询似乎只获得用于for循环的计数。但是for循环似乎并不是必需的。

主查询是set,APP_STATUS !=‘草稿’不在其中(SELECT没有检查值/列在子查询的结果集中。怀疑这只会检查是否为true或false ( APP_STATUS !=‘草稿’的结果)是子查询返回的值。查看您的代码,我认为您的意思是让和APP_STATUS !=‘草稿’和APP_NUMBER不在(选择)。但是,IN不能很好地执行,所以最好将其重新编码为联接。

考虑到这一点,像这样的事情(未经测试):-

代码语言:javascript
复制
<?php

    $queryData = "SELECT a.APP_NUMBER, a.APP_DATA 
                    FROM wf_workflow.APPLICATION a
                    LEFT OUTER JOIN export_workflow.CARDS_CONTACT_DETAILS_LOOKUP b
                    ON a.APP_NUMBER = b.APP_NUMBER
                    WHERE a.PRO_UID='$PRO_UID' 
                    AND a.APP_STATUS != 'CANCELLED' 
                    AND a.APP_STATUS != 'DRAFT' 
                    AND b.APP_NUMBER IS NULL";


    $resultData = $mysqli->query($queryData);

    while($row = mysqli_fetch_array($resultData))
    {

        $data = unserialize($row['APP_DATA']);
        $APP_NUMBER = $row['APP_NUMBER'];
        $PERSON_NAME = $data["PersonalInformation"][1]["FirstName"] . " " . $data["PersonalInformation"][1]["MiddleName"] ." " . $data["PersonalInformation"][1]["LastName"];
        $MOBILE = $data["ContactDetails"][1]["MobileNo"];
        $OFFICE_PHONE = $data["EmploymentInformation"][1]["OfficeTelNo"];
        $HOME_PHONE = $data["ContactDetails"][1]["TelephoneNo1"];

        $sql = "INSERT INTO CARDS_CONTACT_DETAILS_LOOKUP (APP_NUMBER , HOME_PHONE , MOBILE , OFFICE_PHONE, PERSON_NAME)
                VALUES ('$APP_NUMBER' , '$HOME_PHONE' , '$MOBILE' , '$OFFICE_PHONE' , '$PERSON_NAME')";

        if (mysqli_query($mysqli, $sql)) 
        {
            echo "New record created successfully FROM dev";
        } 
        else 
        {
            echo "Error: " . $sql . "<br>" . mysqli_error($mysqli);
        }
    }

    echo "finished the dev";

您还可以通过分批插入来提高脚本的性能(例如,一次插入100行)。这可能不会对脚本超时产生太大影响(等待MySQL的时间不应影响脚本的时间限制),但可能会加快速度。就像这样:-

代码语言:javascript
复制
$queryData = "SELECT a.APP_NUMBER, a.APP_DATA 
                FROM wf_workflow.APPLICATION a
                LEFT OUTER JOIN export_workflow.CARDS_CONTACT_DETAILS_LOOKUP b
                ON a.APP_NUMBER = b.APP_NUMBER
                WHERE a.PRO_UID='$PRO_UID' 
                AND a.APP_STATUS != 'CANCELLED' 
                AND a.APP_STATUS != 'DRAFT' 
                AND b.APP_NUMBER IS NULL";


$resultData = $mysqli->query($queryData);

$inserts = array();

while($row = mysqli_fetch_array($resultData))
{

    $data = unserialize($row['APP_DATA']);
    $APP_NUMBER = $row['APP_NUMBER'];
    $PERSON_NAME = $data["PersonalInformation"][1]["FirstName"] . " " . $data["PersonalInformation"][1]["MiddleName"] ." " . $data["PersonalInformation"][1]["LastName"];
    $MOBILE = $data["ContactDetails"][1]["MobileNo"];
    $OFFICE_PHONE = $data["EmploymentInformation"][1]["OfficeTelNo"];
    $HOME_PHONE = $data["ContactDetails"][1]["TelephoneNo1"];

    $inserts[] =  "'$APP_NUMBER' , '$HOME_PHONE' , '$MOBILE' , '$OFFICE_PHONE' , '$PERSON_NAME')";

    if (count($inserts) > 100)
    {
        $sql = "INSERT INTO CARDS_CONTACT_DETAILS_LOOKUP (APP_NUMBER , HOME_PHONE , MOBILE , OFFICE_PHONE, PERSON_NAME)
                VALUES ".implode(', ', $inserts);
        $inserts = array();
        if (mysqli_query($mysqli, $sql)) 
        {
            echo "New records created successfully FROM dev";
        } 
        else 
        {
            echo "Error: " . $sql . "<br>" . mysqli_error($mysqli);
        }
    }
}

if (count($inserts) > 0)
{
    $sql = "INSERT INTO CARDS_CONTACT_DETAILS_LOOKUP (APP_NUMBER , HOME_PHONE , MOBILE , OFFICE_PHONE, PERSON_NAME)
            VALUES ".implode(', ', $inserts);
    $inserts = array();
    if (mysqli_query($mysqli, $sql)) 
    {
        echo "New records created successfully FROM dev";
    } 
    else 
    {
        echo "Error: " . $sql . "<br>" . mysqli_error($mysqli);
    }
}

echo "finished the dev";

不过,你最好还是逃离你的数据吧!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32221096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档