2017-10-06 97 views
0

我有一个包含超过100K记录的表,并且此表的主键由4列组成。现在我想删除主键但保留由于主键定义而默认创建的索引,因此对于如此大的数据值应避免重新创建索引。如何删除主键约束但保持索引

我正在使用MariaDB 5.5.x版本。

+0

您可以尝试此操作 - 在删除主键之前,在键列上创建索引,然后删除主键。它可能比放弃PK和创建新索引需要更少的时间。 –

回答

1

当你放弃主键时,你不能只保留简单的索引部分。

如果表是innodb,那么最好先删除主键,然后重新创建索引,因为所有secondary indexes contain the primary key也是如此。因此,如果您先创建二级索引,然后放下pk,那么mariadb也必须修改二级索引。

如果您计划创建另一个pk,则先创建该pk,然后根据相同的原因创建任何辅助索引。

1

在InnoDB中,更改PK(PRIMARY KEY)始终需要重建整个表。期。

制作全部单个变化ALTER TABLE。这里会发生什么(所以你可以看到为什么这是最好的)...

  1. 锁定表(阻止任何写入)。
  2. 使用与原始模式相同的模式创建新的(空)表。
  3. 更改新表全部ALTER TABLE指示的方式。
  4. 将所有数据复制到新表中。请注意,它的PK是已更改,这可能涉及重新排列数据。
  5. 重建二级索引。 (我不知道这是作为步骤3的一部分完成的,还是作为单独的通行证完成的。)
  6. RENAME移动新表代替旧的。 (这是原子和速度。)
  7. 解锁。

如果您有两个ALTERs对PK进行两次更改,您将会经历所有这些步骤两次。

每个辅助键都包含PK列的副本。所以任何改变PK 要求重建全部次要钥匙。

在InnoDB中是错误有没有PK的表。 (将提供一个隐藏的序列号,但这会使维护,复制等更加痛苦。)

如果您正在谈论除InnoDB以外的某些引擎,那么不要。你应该只使用InnoDB。 (我说的大部分内容并不适用于MyISAM。)