php - 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)。
任何帮助,将不胜感激。
解决方案
我绝对不会尝试在单个事务中更新 100 万条记录。
我会根据旧 ID 的前几个字符来划分人口。因此,首先仅更新旧 id 的前两个字符为 的记录'95'
,然后遍历所有可能性。在开始更新之前,我会分析每个括号中有多少记录。您不希望有太多记录的括号。
推荐阅读
- python - 将 CSV 中的列转换为列表并汇总每个回报的总和
- firebase - Firebase 控制台
- reactjs - 状态不立即更新
- java - 不终止的 JMS 客户端
- javascript - 为什么类型“数字”不能分配给类型“T”?
- python - python zeep 和 MessagePack 附件
- pug - 如何修复我的 pug 包含的降价文件中损坏的图像链接?
- javascript - jQuery - $.post 延迟对象数组的协调事件处理程序
- sql-server - 一次查询更新多个表
- vba - 使用 VBA 在 MS Project 中返回给定任务 ID 的字段值