在两个表之间查找匹配项,每个表都有160k+行


Finding matches between two tables, each with 160k+ rows

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

两个表的ID都有索引。

我的问题是,这项操作非常耗时;有人知道一种更有效的方法来搜索匹配的UUID吗?附带说明:我们正在使用PHP 5.3 的MySQLi扩展

Exp代码:

$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);

提前谢谢。

在SQL中完成这一切。

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

CCD_ 1允许CCD_。JOIN表,并使您的WHERE条件与您的描述相匹配。应该非常简单而且速度明显更快。

几个月前我写了一个函数
您可以根据需要对其进行修改。

这可以提高搜索的速度

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,表示速度为
一些方法在课堂上,你可以很容易地写主题。。。