sql - Mysql根据另一个包含索引的表创建表

标签 sql mysql database performance

我需要基于 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/

相关文章:

MySQL:选择每个聚合组中的最后一行

python - 使用Python脚本获取标题标签的内容

mysql - SQL 中除 0 以外的值的平均值(除 0 外是唯一值)

mysql - 似乎无法找到 mysql 数据库

mysql - 我有一个子表,它依赖于两个不相关的父表。我想将行插入子表中

database - 如何存储和压缩数据以进行实时数据记录?

php - 即使使用 utf8mb4_unicode_ci,MySQL 也会出现 "Incorrect string value"错误

sql - MySQL:如何为所有时区选择 UTC 偏移量和 DST?

mysql - 使用perl DBI在数据库中插入带有单引号(')的数组

mysql - Codeigniter - 多个数据库连接