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

时间:2012-09-04 20:07:02

标签: php mysql performance refactoring

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

两个表都有ID的索引。

我的问题是这个操作极其耗时;有没有人知道更有效的方法来搜索匹配的UUID?旁注:我们正在使用MySQL 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);

提前谢谢。

2 个答案:

答案 0 :(得分:3)

在SQL中执行此操作。

我的代码中没有任何内容需要PHP。

UPDATE允许JOINJOIN 表,并使您的WHERE条件与您的说明相匹配。应该非常简单,速度要快得多。

答案 1 :(得分: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,以获得...的速度 一些方法在课堂上,你可以轻松地写主题......