全部產品
Search
文件中心

PolarDB:INVISIBLE INDEX

更新時間:Jul 06, 2024

本文檔介紹了如何使用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。