0

それぞれ160k以上の行を持つ2つのテーブルがあります。2 つの間でいくつかの 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);

前もって感謝します。

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つの部分に分割し、各反復はその4分の1しか取得しません...
この数値をたとえば10または20に変更して、速度を上げることができます...
一部のメソッドはクラスにあり、テーマを簡単に記述できます。 ..

于 2012-09-04T20:24:56.053 に答える