Php 在MySQL中加速数据迁移

Php 在MySQL中加速数据迁移,php,mysql,pdo,Php,Mysql,Pdo,我目前正在将一个非常大的(至少在我的新手经验中是最大的)数据库迁移到另一个结构中 事实上,我正在尝试将数据从一个非常旧的经过大量修改的SMF数据库迁移到Flarum中,这是我作为学习步骤而采取的步骤 现在我有了所有帖子中所有用户的SMF特定用户ID,现在我想将帖子迁移到Flarum。然而,问题是SMF用户ID与Flarum用户ID不同。Flarum数据库中的数据是由AUTO_INCREMENT属性创建的,因此不同 所以为了翻译所有的帖子,我使用了这个简单的循环,它正在工作,现在我正在考虑优化它

我目前正在将一个非常大的(至少在我的新手经验中是最大的)数据库迁移到另一个结构中

事实上,我正在尝试将数据从一个非常旧的经过大量修改的SMF数据库迁移到Flarum中,这是我作为学习步骤而采取的步骤

现在我有了所有帖子中所有用户的SMF特定用户ID,现在我想将帖子迁移到Flarum。然而,问题是SMF用户ID与Flarum用户ID不同。Flarum数据库中的数据是由
AUTO_INCREMENT
属性创建的,因此不同

所以为了翻译所有的帖子,我使用了这个简单的循环,它正在工作,现在我正在考虑优化它

while ($topic = $topics->fetch())
{
    $posts = $db->query("SELECT * FROM smf_posts WHERE ID_TOPIC = @{$topic->ID_TOPIC}");
    $posts->setFetchMode(PDO::FETCH_OBJ);

    while ($post = $posts->fetch())
    {
        $user = $db2->query("SELECT id FROM flarum_users WHERE user_name = @{$post->posterName}");
        $user = $user->fetch();

        // Now insert the post
    }

    // Now insert the topic into discussions
}
现在,我得到的数据集中总共有36194个主题,这次迁移在我的机器上花了我整整30分钟的时间

我知道我必须在一个查询中获取大量数据才能使其更快,但我只是不知道如何实现。我最初想连接这两个表,但它们位于不同的数据库中,更糟糕的是,它们位于不同的服务器中


我应该怎么做呢?

首先,我想谈谈优化一项只需执行一次的任务是否值得。改进是否需要超过30分钟?如果是这样,那就不用麻烦了。只需在30分钟内运行它,并称之为成功。除非您需要多次运行此迁移。那也许值得改进一下

flarum中有多少用户?大概不超过几千。您可以通过在开始处理主题之前执行一个查询来消除重复的内部查询,并在PHP关联数组中保留用户名到id的映射

$userQuery = $db2->query("SELECT id, user_name FROM flarum_users");
$userData = $userQuery->fetchAll(PDO::FETCH_OBJ);
$userMap = [];
foreach ($userData as $user) {
  $userMap[$user->user_name] = $user->id;
}

// then start processing topics
在循环内部,您可以使用
$userMap
更快地将用户名更改为id,这只是关联数组查找,而不是运行另一个SQL查询

while ($post = $posts->fetch())
{
  $userId = $userMap[$post->posterName]; // no SQL query
  // insert post
}
通常,这种技术被称为。如果您有在循环中运行的代码,但是无论您运行多少次,结果都是相同的,那么为什么要在循环中运行呢?在循环之前执行一次,并将结果保存在某个变量中


我也同意@Ben的上述评论:确保你在数据库表上有一个
smf\U posts.ID\u TOPIC
的索引,以便更快地选择帖子。

ID\u TOPIC
user\u name