在一个事务中使索引成为非常大的 MySQL 表中的唯一索引 - 以下方法安全吗?

Bla*_*bam 3 mysql index optimization transaction query-performance

为了优化 SELECT 语句,我尝试在 MySQL 中使用以下 SQL 语句使索引唯一:

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

我的问题是:这是一笔交易吗?这意味着如果创建唯一索引失败,旧的special_credential_id索引是否仍然存在?通常创建一个新索引很容易,但我们讨论的是包含 100 个 Mio 条目的表。

Rol*_*DBA 5

这是一笔交易。它应该按原样工作,但请按照以下两个步骤操作:

步骤1

在执行此操作之前,请测试唯一性。运行此计数查询:

SELECT special_credential_id,COUNT(1) cnt FROM credentials 
GROUP BY special_credential_id HAVING COUNT(1) > 1;
Run Code Online (Sandbox Code Playgroud)

如果有任何行返回(即不是“空集”),请修复键以使它们是唯一的。否则,继续

第2步

我会将其作为在线 DDL 执行

ALTER TABLE credentials
    DROP INDEX special_credential_id
   ,ADD UNIQUE KEY special_credential_id (special_credential_id)
   ,ALGORITHM=INPLACE
   ,LOCK=NONE
;
Run Code Online (Sandbox Code Playgroud)

如果您担心这不起作用,请分两步进行

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
;
Run Code Online (Sandbox Code Playgroud)