1

2 つの異なるサーバーに 2 つのデータベースがあります。ソース データベースは大規模な不動産データベースで、2 つ目は Wordpress データベースです。ソースから Wordpress データベースの投稿と postmeta テーブルにデータをインポートする必要があります。

現在、ソースデータベースからすべてを引き出してから、それらの結果をループして、別のネストされたクエリを使用して投稿テーブルに挿入し、投稿挿入からの挿入 ID を使用して各フィールドをメタ値として挿入しています。いわば、メモリーホグです。

私の質問は、個々の挿入行がそれほど多くないように、以下のループを改善できますか? または、これをより速く/ずさんにしないための提案はありますか?

// SOURCE DB
$query = "select $fields from listings where data_id = 'B'"; 

$result = mysql_query($query);

// WORDPRESS DB
while ($row = mysql_fetch_assoc($result)) {
    $query2 = "insert into wp_posts (post_author, post_content, post_title, post_status, comment_status, ping_status, post_name, post_type) values";
    $query2 .= " ('1', '" . mysql_real_escape_string($row['remarks']) . "', '{$row['mls_acct']}', 'publish', 'closed', 'closed', '{$row['mls_acct']}', 'properties')";

    $result2 = mysql_query($query2);

    $id = mysql_insert_id();

    foreach ($row as $key => $val)
    {
        $query3 = "insert into wp_postmeta (post_id, meta_key, meta_value) values ";

        $query3 .= "('$id', '$key', 'mysql_real_escape_string($val)')";

        $result3 = mysql_query($query3);
    }
}
4

2 に答える 2

0

INSERT ... SELECT FROM ...内部で実行しているループ バージョンではなく、おそらく単一のクエリとして実行できます。

INSERT INTO wp_postmeta (post_id, meta_key, meta_value)
    SELECT $id, meta_key, meta_value FROM wp_posts WHERE id = $id

私は WP の内部構造に特に詳しくありません (そして、私は実際にはそうなりたくありません...) が、これを調整して機能させることができれば、ループ内で数十の個別の挿入クエリを節約できます。

于 2012-12-10T16:52:18.397 に答える
0

これについて私が最初に考えたのは、レコードを一度に 1 つずつではなく、バッチで挿入することです。したがって、内側の挿入は次のようになります。

insert into wp_postmeta (post_id, meta_key, meta_value) values
(1, meta_key_1, meta_value_1),
(1, meta_key_2, meta_value_2),
(1, meta_key_3, meta_value_3),
(1, meta_key_4, meta_value_4),
(1, meta_key_5, meta_value_5),
(1, meta_key_6, meta_value_6),
(1, meta_key_7, meta_value_7),
...
(1, meta_key_100, meta_value_100);

バッチあたりの最適なレコード数はわかりませんが、おわかりいただけたと思います。

于 2012-12-10T16:58:31.207 に答える