在MySQL 8.0之前的版本中,索引只能直接刪除。如果刪除后發現引起了系統故障,又必須進行創建。當表的數據量比較大的時候,這樣做的代價就會非常高。
在MySQL 8.0中,提供了隱藏索引。如果想刪除某個索引,那么在實際刪除之前,可以將其設置為隱藏,此時查詢優化器就不會再使用此索引。確認對系統不會產生影響后,再實際刪除。
演示
- 創建表時創建隱藏索引
CREATE TABLE `ts2` (`id` int not NULL,`name` int DEFAULT NULL,primary key(id),KEY `idx_name` (`name`) invisible
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
- 切換成非隱藏
ALTER TABLE ts2 ALTER INDEX idx_name VISIBLE;
- 再次切換成隱藏
ALTER TABLE ts2 ALTER INDEX idx_name invisible;
- 在已經存在的表上,創建新索引
CREATE TABLE `ts3` (`id` int not NULL,`name` int DEFAULT NULL,primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
在MySQL 8.0中創建新索引時,默認就是可見的
create index idx_name on ts3(name);
在MySQL 8.0中創建新索引時,默認就是可見的,也可以顯示指定索引隱藏
create index idx_name_2 on ts3(name) invisible;
使隱藏索引對查詢優化器可見
select @@optimizer_switch;
use_invisible_indexes=off說明隱藏索引默認對查詢優化器不可見
設置為on可以讓隱藏索引對查詢優化器可見
set session optimizer_switch="use_invisible_indexes=on";