基于另一个表创建包括索引的Mysql表

3
我需要在MySQL中创建一个基于另一个表的表,包括约束和索引。
我有以下情况:
表A - 可能已有数百万行。
我想创建与表A完全相同(包括约束和索引)的表B。
从A和其他一些数据源处理数据并将其插入B中。
最后,在处理结束时删除表A(删除关联表A的索引)并将表B重命名为A,包括索引。
最佳方法是什么?性能是我的真正关注点。
谢谢
1个回答

1
在这种情况下,我们假设您知道表的结构。换句话说,您不是在问“如何找出所有这些列、索引和约束条件是什么”。
其次,我们倾向于假设表A中的所有数据都是有效的,因此在从A复制到B时,您不需要强制执行约束条件。
您的“其他来源”是一个通配符。我假设您不知道这个其他来源是否包含有效数据,并建议:
1)创建没有索引或约束条件的B
2)从“其他来源”复制/批量插入到B
3)通过发出SELECTS来查找无效行来执行约束条件。如果您知道数据是有效的,则跳过此步骤。一旦可以继续进行:
4)将A分块复制到B。问题在于,直接选择...INTO...的所有X百万行将花费很长时间(因为需要在单个隐含事务中执行它所需的资源爆炸),但逐行处理也将花费很长时间(因为一次只处理一行太慢了)。因此,您可以每次处理1000或10000行的块。
5)当所有数据都复制完毕后,添加索引。

6) 添加约束

7) 删除 A

8) 重命名 B


在这里,“CREATE TABLE ... LIKE oldtable”可能会派上用场,尽管它会复制索引定义。 - Marc B
1
谢谢Marc,我可能会使用LIKE,我的犹豫是因为关于LIKE语句的以下描述。CREATE TABLE ... LIKE不保留为原始表指定的任何DATA DIRECTORY或INDEX DIRECTORY表选项,也不保留任何外键定义。目前我的表中没有任何外键,所以我可能会选择这个。@Ken,我不能按照您建议的那样做,因为我需要同时处理原始表的内容和新数据。 - Mahesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接