我在2个不同的服务器上有2个数据库。源数据库是一个海量房地产数据库,第二个是Wordpress数据库。我必须将数据从源导入到Wordpress数据库的post和postmeta表中。
目前,我正在从源数据库中取出所有内容,然后循环遍历这些结果,使用另一个嵌套查询将它们插入到posts表中,以使用post insert中的插入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);
}
}发布于 2012-12-11 00:58:31
我的第一个想法是批量插入记录,而不是一次插入一个。所以你的内部插入最终会是这样的:
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-11 00:52:18
您可以将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的内部结构(我真的真的不想变得如此……),但是如果你可以调整它来工作,你就可以在循环中省去几十个单独的insert查询。
https://stackoverflow.com/questions/13805217
复制相似问题