本文檔介紹了如何使用INVISIBLE INDEX功能。
背景資訊
PolarDB-X支援把index的可見度設定為VISIBLE/INVISIBLE。如果一個index的可見度為INVISIBLE,最佳化器將不使用該索引。
在大表上建立/刪除索引是一個耗時的操作,但修改索引的可見度卻很快。因此您可以在不真正刪除一個索引的情況下,通過把該索引的可見度設定成INVISIBLE來評估刪除索引對您的業務查詢效能的影響。
前提條件
PolarDB-X執行個體版本需在5.4.17-16835173及以上。查看執行個體版本的方法請參見查看和升級執行個體版本。
注意事項
INVISIBLE INDEX功能同時支援AUTO模式資料庫與DRDS模式資料庫。
INVISIBLE INDEX僅支援全域二級索引,不支援Local Index。
修改索引的可見度不會影響索引的維護。無論可見度設定為INVISIBLE還是VISIBLE,索引資料都會隨著主表資料的更新而更新。如果該索引具有唯一性限制式,可見度的設定也不會影響它的唯一性限制式。
當一個索引的狀態為INVISIBLE時,對其使用force index是無效的。
樣本
為方便表述,以下樣本的建表文法採用AUTO模式資料庫的文法。
不指定VISIBLE/INVISIBLE關鍵字,直接建表,index的可見度預設為VISIBLE。
create table t_order ( `id` bigint(11), `order_id` varchar(20), `buyer_id` varchar(20), global index `g_order_id` (order_id) partition by key(order_id) ) partition by hash(`id`);
建表時指定index的可見度。
create table t_order ( `id` bigint(11), `order_id` varchar(20), `buyer_id` varchar(20), global index `g_order_id` (order_id) partition by key(order_id) invisible ) partition by hash(`id`);
在已經建好的表上添加index,並指定該index的可見度(如不指定VISIBLE/INVISIBLE則預設可見)。
alter table t_order add global index g_buyer_id(buyer_id) partition by hash(buyer_id) invisible;
修改已經建立的index的可見度。
-- 改為invisible狀態 alter table t_order alter index `g_order_id` invisible; -- 改為visible狀態 alter table t_order alter index `g_order_id` visible;
常見問題
Q:把一個index的可見度設定為INVISIBLE後,該檢查哪些方面,從而評估刪除這個index對業務的影響?
A:您可以從包括但不限於以下這些方面進行檢查:
在業務負載不變的情況下,觀察PolarDB-X執行個體的CPU、記憶體等指標是否有較大變化;
是否出現預期以外的慢SQL;
如果您正在壓測,可以觀察壓測結果是否有較大變化;
如果您曾在查詢語句中用force index顯式指定過此index,您可以觀察這些查詢語句是否變慢。
Q:把索引改為INVISIBLE狀態,會影響用到該索引的所有SQL。如何查看某條特定的SQL不使用該索引時的效果?
A:這種情況下您無需使用invisible index,可以通過ignore index來提示最佳化器在查詢時忽略該index。