本文說明在 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 INDEXDDL 陳述式的包裝函式。mysql.dropSecondaryIdxOnReplica:從唯讀副本中捨棄先前建立的次要索引。這個預存程序是DROP INDEXDDL 陳述式的包裝函式。
必須具備 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 會在重新建立執行個體時捨棄現有的自行管理索引,並根據註冊的定義自動建立代管副本索引。
後續步驟
- 瞭解如何建立及管理唯讀副本索引。
- 瞭解如何管理唯讀副本。
- 瞭解如何建立唯讀副本。
- 瞭解 Cloud SQL 中的複製功能。
- 瞭解複製延遲。
- 瞭解如何設定資料庫旗標。
- MySQL 適用的 Cloud SQL 預存程序。
- 瞭解進階災難復原 (DR)。
- 瞭解如何使用 MySQL 用戶端連線。