我需要基于 MYsql 中的另一个表创建一个表,包括约束和索引。
我有以下场景:
表 A- 可能有数百万行。 我想创建与表 A 完全相同的表 B(包括约束和索引)。 处理来自 A 和其他来源的数据并插入到 B。 在处理结束时删除表 A(删除与表 A 关联的索引)并将表 B 重命名为 A,包括索引。
最好的方法是什么?性能是我真正关心的。
谢谢
最佳答案
在这种情况下,我们假设您知道表的结构。换句话说,您不是在问“我如何找出所有这些列、索引和约束是什么”。
其次,我们倾向于假设表 A 中的所有数据都是有效的,因此您不需要在从 A 复制到 B 时强制执行约束。
您的“其他来源”是一个通配符。我假设您不知道这个其他来源是否包含有效数据,并且会建议:
1) 创建没有索引或约束的 B
2) 从“其他来源”复制/批量插入到 B
3) 通过发出 SELECTS 来查找无效行来执行约束。如果您知道数据有效,请跳过此步骤。一旦可以继续:
4) 以“ block ”的形式将 A 复制到 B。这里的问题是,所有 X 百万行的直接 SELECT...INTO... 将永远花费(因为在单个隐含事务中执行此操作所需的资源爆炸),但逐行也会花很长时间(因为一次做一行很慢)。因此,您一次处理 1000 或 10000 行的 block 。
5) 当所有数据都复制过来后,加上索引
6) 添加约束
7)放下A
8) 重命名B
关于sql - Mysql根据另一个包含索引的表创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4800568/