Mysql

在一個事務中使索引成為非常大的 MySQL 表中的唯一索引 - 以下方法安全嗎?

  • January 24, 2022

為了優化 SELECT 語句,我嘗試在 MySQL 中使用以下 SQL 語句創建索引 UNIQUE:

ALTER TABLE credentials DROP INDEX special_credential_id, ADD UNIQUE KEY special_credential_id(special_credential_id)

我的問題是:這是一筆交易嗎?這意味著如果創建唯一索引失敗,舊的 special_credential_id 索引是否仍然存在?通常創建一個新索引很容易,但我們談論的是一個包含 100 個 Mio 條目的表。

那是一筆交易。它應該按原樣工作,但請按照以下兩個步驟操作:

第1步

在執行此操作之前,請測試唯一性。執行此計數查詢:

SELECT special_credential_id,COUNT(1) cnt FROM credentials 
GROUP BY special_credential_id HAVING COUNT(1) > 1;

如果有任何行返回(即,不是“空集”),請修復鍵,使它們是唯一的。否則,繼續

第2步

我將作為線上 DDL 執行此操作

ALTER TABLE credentials
   DROP INDEX special_credential_id
  ,ADD UNIQUE KEY special_credential_id (special_credential_id)
  ,ALGORITHM=INPLACE
  ,LOCK=NONE
;

如果您擔心這不起作用,請分兩步進行

ALTER TABLE credentials
   ADD UNIQUE KEY special_credential_id_2 (special_credential_id)
  ,ALGORITHM=INPLACE
  ,LOCK=NONE
;
ALTER TABLE credentials
   DROP INDEX special_credential_id
  ,ALGORITHM=INPLACE
  ,LOCK=NONE
;

引用自:https://dba.stackexchange.com/questions/306508