2017-10-06 79 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。)