0

我有两个表,每个表都有 160k+ 行。两者之间共享一些 UUID。我正在“新”表上使用 foreach 循环,并使用嵌入式 foreach 搜索“旧”表。当 UUID 匹配结束时,“旧”表将使用“新”表中的数据进行更新。

两个表的 ID 都有一个索引。

我的问题是这个操作非常耗时;有谁知道一种更有效的方法来搜索匹配的 UUID?旁注:我们正在使用 PHP 5.3 的 MySQLi 扩展

进出口代码:

$oldCounter = 0;
$newCounter = 1;
//loop
foreach( $accounts as $accKey=>$accValue )
{
echo( "New ID - " . $oldCounter++ . ": " . $accValue['id'] . "\n" );

foreach( $accountContactData as $acdKey=>$acdValue )
{
    echo( "Old ID - " $newCounter++ . ": " . $acdValue['id'] . "    \n" );

    if( $accValue['id'] == $acdValue['id'] && (
        $accValue['phone_office'] == "" || $accValue['phone_office'] == NULL || $accValue['phone_office'] == 0 )
    ){
        echo("ID match found\n");
        //when match found update accounts with accountsContact info
        $query = '
            UPDATE `accounts`
            SET
                `phone_fax` = "' . $acdValue['fax'] . '",
                `phone_office` = "' . $acdValue['telephone1'] . '",
                `phone_alternate` = "' . $acdValue['telephone2'] . '"
            WHERE
                `id` = "' . $acdValue['id'] . '"
        ';
        echo "" . $query . "\n\n";

        $DB->query($query);

        break 1;
    }

}
}
unset($oldCounter);
unset($newCounter);

先感谢您。

4

2 回答 2

3

这一切都在 SQL 中完成。

我在您的代码中没有看到任何需要 PHP 的内容。

UPDATE允许JOIN. 新旧表,并让您的JOIN条件与的描述相匹配。应该非常简单并且明显更快。WHERE

于 2012-09-04T20:16:07.360 回答
1

几个月前我写了一个函数,
你可以随意修改。

这可以提高您的搜索速度

public static function search($query)
{
    $result = array();
    $all = custom_query::getNumRows("bar");
    $quarter = floor(0.25 * $all) + 1;
    $all = 0;
    for($i = 0;$i<4;$i++)
    {
        custom_query::condition("", "limit $all, $quarter");
        $data = custom_query::FetchAll("bar");
        foreach ($data as $v)
            foreach($v as $_v)
                if (count(explode($query, $_v)) > 1)
                    $result[] = $v["bar_id"];
        $all += $quarter;
    }
    return $result;
}

它会返回与搜索匹配的记录的 ID。

此方法将表格分为 4 个部分,每次迭代仅获得四分之一...
您可以将此数字更改为例如 10 或 20 以提高速度...
一些方法在类中,您可以轻松编写主题。 ..

于 2012-09-04T20:24:56.053 回答