唯讀副本索引總覽

本文說明在 Cloud SQL Enterprise 版和 Cloud SQL Enterprise Plus 版 兩個版本中,管理 Cloud SQL 唯讀副本次要索引的概念和機制。在 MySQL 中,您可以在資料表上建立兩種主要類型的索引:

  • 分群索引:MySQL 資料表的主要索引,會實際排序磁碟上的資料列。在資料表定義主鍵時,MySQL 會將其做為叢集索引。一個資料表只能有一個叢集索引。
  • 次要索引:MySQL 資料表上的額外索引,可最佳化查詢效能。

    雖然副本通常是唯讀,但您可以在資料表上建立次要索引,用於產生報表。Cloud SQL 支援兩種建立副本次要索引的方法:

    • 代管副本索引 (建議):Cloud SQL 會將索引定義儲存在主要執行個體上,並在副本停止運作或重新建立後,自動重建次要索引。Google 建議使用代管索引,而非自行管理的索引,以免索引遺失,並避免手動還原索引。
    • 自行管理的副本索引:可讓您直接在副本上新增及捨棄次要索引,但這些索引在副本當機或重新建立後不會保留。如果您使用的是自行管理的索引,可以改用代管副本索引。

比較副本索引方法

下表比較 Cloud SQL 中的代管副本索引和自行管理的副本索引:

功能 代管副本索引 自行管理的副本索引
重新建立副本後仍會保留 自動重建 已捨棄 (必須手動重建)
設定模型 主要執行個體上的集中式中繼資料 直接在目標唯讀副本上執行 DDL
執行機制 定期背景程序
(大約每五分鐘一次)
立即執行
複製延遲時間防護機制 如果複製作業延遲超過 20 分鐘,系統會自動暫停建立索引 無 (使用者自行管理)
支援版本 Cloud SQL Enterprise 版和 Cloud SQL Enterprise Plus 版 Cloud SQL Enterprise 版和 Cloud SQL Enterprise Plus 版
支援的資料庫版本 MySQL 適用的 Cloud SQL
(維護版本 R20260726.00_05 以上)
MySQL 適用的 Cloud SQL
(所有支援的版本)
外部伺服器副本支援 不支援 支援

代管副本索引

為避免在重新建立副本後遺失索引,Cloud SQL 支援代管副本索引。Google 建議使用這個方法建立及保留索引。Cloud SQL 預設會啟用這個方法。

代管副本索引需要 Cloud SQL 維護版本 R20260726.00_05 以上。

以下各節說明 Cloud SQL 如何維護副本索引、副本索引的優點,以及副本索引在生命週期事件期間的行為。

Cloud SQL 如何維護代管副本索引

使用這個方法時,您需要定義副本次要索引、將其分組,並指定哪些副本可以維護這些索引群組。Cloud SQL 會在副本上執行背景程序,自動建立及捨棄必要的索引,並持續維護索引。Cloud SQL 建立代管副本索引時,會在索引註解前面加上 [SIC_X_Y] 標記,其中 X 和 Y 是整數。這個標記僅用於內部管理,不具任何功能。

Cloud SQL 會批次執行代管副本索引維護作業,例如建立及捨棄索引。Cloud SQL 索引維護程序擷取一組 CREATE 或 DROP 動作後,會為每個次要索引建立 PENDING 狀態項目。然後依序執行每個資料定義語言 (DDL) 陳述式。如果某個索引失敗,不會影響佇列中後續索引的執行。Cloud SQL 則會在大約五分鐘後,擷取下一批資料。

優點及用途

代管副本索引具備下列優點:

  • 自動保留索引:Cloud SQL 重新建立唯讀副本時 (例如執行個體當機後),會自動重建對應至該副本的次要索引。您不必手動執行預存程序,或維護外部結構定義追蹤指令碼,即可還原缺少的索引。
  • 一致的查詢效能:Cloud SQL 會在副本復原後自動重建次要索引,維持查詢處理量,並防止未建立索引的查詢導致查詢延遲時間激增和 CPU 使用率偏高。
  • 以群組為基礎的設定:在主要執行個體上定義次要索引一次,並將其整理至已命名的副本群組。接著,只要設定單一資料庫旗標 (cloudsql_index_recreate_replica_group),即可將包含數百個索引的索引群組指派給唯讀副本。這樣一來,您就不必在多個副本中執行個別預存程序。
  • 依副本角色選擇性指派索引:您可以將索引群組指派給報表和數據分析唯讀副本,加快讀取查詢速度,同時讓災難復原 (DR) 唯讀副本保持未建立索引的狀態,並與主要執行個體結構定義相同。這可避免 DR 執行個體上的寫入交易負擔和複製延遲。
  • 主要執行個體效能隔離:唯讀副本上的次要索引可最佳化讀取和報表查詢,不會耗用儲存空間,也不會增加主要執行個體的寫入交易延遲時間。
  • 內建觀測能力:專屬預存程序可讓您監控讀取副本的索引建立進度、執行時間長度和錯誤記錄。
  • 不中斷遷移和共存:代管副本索引可與現有的自行管理副本索引安全共存,兩者位於相同的執行個體和資料表。您可以逐步採用代管副本索引,不會造成停機,也不會中斷進行中的讀取查詢工作負載。

副本升級

Cloud SQL 只會在唯讀副本執行個體上維護代管副本索引。如果您將唯讀副本升級為主要執行個體,Cloud SQL 會自動捨棄任何建立為代管副本索引的次要索引。Cloud SQL 執行捨棄作業前,可能會有約五分鐘的延遲。

雖然 Cloud SQL 會捨棄次要索引,並從升級後的執行個體中移除資料庫旗標,但主要執行個體會保留次要索引定義和群組對應。

災難復原 (DR) 切換

在 DR 切換期間,當您將 DR 副本升級為新的主要執行個體時,Cloud SQL 會自動捨棄在 DR 副本上建立的所有次要索引。舊的主要執行個體變成副本時,Cloud SQL 不會自動在該執行個體上建立這些次要索引。

如要在切換後,於舊的主要執行個體建立次要索引,請在該執行個體設定 cloudsql_index_recreate_replica_group 資料庫旗標。

複製延遲

如果複製作業延遲超過 20 分鐘,Cloud SQL 會暫停建立次要索引。如果延遲時間超過 20 分鐘時,代管副本索引建立作業已在進行中,Cloud SQL 會讓作業完成。複製延遲不會暫停代管副本索引捨棄作業。

限制

使用代管副本索引時,請注意下列限制:

  • 無法在外部伺服器副本上建立代管副本索引:Cloud SQL 不支援為外部伺服器副本建立代管副本索引。
  • 每個副本群組最多可有 1,000 個索引:一個副本群組最多可指派 1,000 個次要索引。
  • 不支援更新或變更索引中繼資料:您無法更新或變更現有的索引中繼資料。如要修改索引,必須刪除現有的索引定義,然後建立新的定義。

自行管理的副本索引

自行管理的副本索引是次要索引,可直接在個別 Cloud SQL 唯讀副本上建立及捨棄。與代管副本索引一樣,這類索引可最佳化讀取查詢效能 (例如報表和數據分析工作負載),不會耗用儲存空間,也不會影響主要執行個體的寫入延遲時間。

自行管理索引

您可以使用 mysql 結構定義中的下列預存程序,直接在唯讀副本上管理自行管理的副本索引:

  • mysql.addSecondaryIdxOnReplica:在唯讀副本的指定資料表上新增次要索引。這個預存程序是 CREATE INDEX DDL 陳述式的包裝函式。
  • mysql.dropSecondaryIdxOnReplica:從唯讀副本中捨棄先前建立的次要索引。這個預存程序是 DROP INDEX DDL 陳述式的包裝函式。

必須具備 cloudsqlsuperuser 角色,才能執行這些預存程序。

建立自行管理的索引時,Cloud SQL 會在副本的 mysql.cloudsql_replica_index 資料表中記錄基本中繼資料,包括資料庫名稱、資料表名稱和索引名稱。與代管副本索引不同,自行管理的索引不會在主要執行個體上註冊,也不會由 Cloud SQL 背景複製程序維護。

如需語法詳細資料和使用範例,請參閱「自行管理的副本索引」。

優點及用途

自行管理的副本索引可為特定工作流程帶來下列好處:

  • 主要執行個體效能隔離:唯讀副本上的次要索引可最佳化讀取和報表查詢,不會耗用儲存空間,也不會增加主要執行個體的寫入交易延遲時間。
  • 立即執行:預存程序呼叫會立即在副本上以 DDL 陳述式執行,不必等待代管副本索引所需的定期背景維護週期 (約每五分鐘一次)。
  • 獨立測試和實驗:您可以在個別唯讀副本上測試查詢效能,並驗證索引最佳化,然後再為整個副本群組建立代管副本索引。

限制

自行管理的副本索引有重大作業限制:

  • 重新建立副本時無法保留:如果 Cloud SQL 重新建立唯讀副本 (例如在執行個體復原、維護或硬體故障期間),該副本上的所有自行管理次要索引都會遭到捨棄,且不會自動還原。
  • 手動還原負擔:Cloud SQL 無法重建索引。您必須再次執行 mysql.addSecondaryIdxOnReplica,手動重新建立索引。
  • 查詢效能降低:重新建立副本後,讀取查詢的效能可能會降低,直到您手動重建缺少的索引為止。

由於代管副本索引會在副本重新建立事件中自動保留及重建,因此 Google 建議在正式環境工作負載中使用代管副本索引。如果您已有自行管理的索引,請將其遷移至代管副本索引。

副本索引類型並存

自行管理的副本索引 (使用 mysql.addSecondaryIdxOnReplica 建立) 和代管副本索引,可以同時存在於同一個 Cloud SQL 唯讀副本執行個體和同一個資料表。這樣一來,您就能逐步採用代管副本索引,不會中斷現有的資料庫工作負載。

同時使用這兩種索引管理方法時,請注意下列行為:

  • 獨立運作:直接在唯讀副本上建立的自行管理索引,會與代管副本索引一起運作。
  • 定期評估:Cloud SQL 背景維護程序會定期 (約每五分鐘) 評估對應至指派給副本的副本群組的索引定義。
  • 名稱衝突處理:如果您註冊的代管副本索引定義,與唯讀副本上現有的自行管理索引同名,背景程序會偵測到已有同名索引。這項程序會在 mysql.cloudsql_replica_idx_status 資料表中記錄 FAILED 狀態。這項錯誤不會影響資料庫流量、建立資料表鎖定,或影響現有的自行管理索引。
  • 重新建立時自動解決:重新建立唯讀副本時,Cloud SQL 會在重新建立執行個體時捨棄現有的自行管理索引,並根據註冊的定義自動建立代管副本索引。

後續步驟