首页 > 解决方案 > SQL-Server 'uniqueidentifier' 列类型的迁移问题到 MySQL

问题描述

我的客户的旧应用程序是在 .NET 中使用 MS-SQL 数据库开发的。早期的开发人员使用 UNIQUEIDENTIFIER 作为所有需要的表的主键。

在我使用 PHP 和 MySQL 开发的新应用程序中,我编写了将所有数据从 MS-SQL 迁移到 MySQL 的脚本。问题在于 2 个表格,特别是如下所示。

AccountMaster 拥有大约 45,000 个帐户和大约 1M 行的 Transactions。

在较旧的应用程序中,AccountMaster 的 ID 为 UNIQUEIDENTIFIER,并且 Transactions 表引用它。

在我的表格中,我已将 AccountMaster ID 迁移为 OldID,并且正在创建 INT 类型(自动增量)的新 ID。

因此,我设法迁移了我的 AccountMaster 中的所有 45K 帐户以及我的 Transactions 表中的 1M 交易,同时在 AccountMaster 和 Transactions 中将旧 ID (UNIQUEINDENTIFIER) 保持为 OldID。

下面是在我的 MySQL 数据库中迁移后的场景

AccountMaster
-------------
+----+--------------------------------------+-----------------------+
| ID | OldID                                | Name                  |
+----+--------------------------------------+-----------------------+
| 1  | 95221456-99BB-4B62-BA30-C8C527FD78E4 | Account 1             |
| 2  | 21952200-E0B9-434B-AAF7-D3EF96BCE16F | Account 2             |
| .  |                                      |                       |
+----+--------------------------------------+-----------------------+

Transactions
------------
+----+--------------------------------------+------------+---------+
| ID | OldAccountID                         | Date       | Amount  |
+----+--------------------------------------+------------+---------+
|    | 95221456-99BB-4B62-BA30-C8C527FD78E4 | 2018-10-07 | 100.00  |
+----+--------------------------------------+------------+---------+

现在的问题是,当我运行如下查询以使用新 ID 更新 Transactions 表时,它需要几个小时并且永远不会真正完成。我必须在 3 小时后中止它。

UPDATE `Transactions` AS A
    INNER JOIN `AccountMaster` AS B ON A.OldAccountID=B.OldID
SET A.ID=B.ID

知道如何缓解这个问题吗?我很确定 36 个字符的 OldID 在迁移后会产生问题,即使 AccountMaster 中的所有列“ID”和“OldID”以及 MySQL 中的 Transactions 中的“ID”和“OldAccountID”都已编入索引。OldID 和 OldAccountID 列的类型为 VARCHAR(40)。

任何帮助,将不胜感激。

标签: phpmysqlsql-server

解决方案


我绝对不会尝试在单个事务中更新 100 万条记录。

我会根据旧 ID 的前几个字符来划分人口。因此,首先仅更新旧 id 的前两个字符为 的记录'95',然后遍历所有可能性。在开始更新之前,我会分析每个括号中有多少记录。您不希望有太多记录的括号。


推荐阅读