在唯讀備用資源中建立及管理索引

本頁面說明如何在 Cloud SQL 讀取副本上新增及刪除索引。雖然副本通常為唯讀,但有時您可能會想在資料表上建立次要索引,以便製作報表。Cloud SQL 提供一組儲存程序,可用於管理這些索引。

術語

  • 分群索引。這是 MySQL 資料表的主要索引,可在磁碟上實體排序資料列。在資料表上定義主鍵時,MySQL 會將其用作叢集索引。一個資料表只能有一個叢集索引。
  • 次要索引:在 MySQL 資料表中新增索引,以改善查詢效能。

索引的預存程序

Cloud SQL 在 mysql 結構定義中提供兩個儲存程序,可用於在 MySQL 唯讀備用資源上新增及刪除次要索引。請注意,雖然這些程序可在主要來源例項上執行,但它們是專為唯讀備用資源而設計。

mysql.addSecondaryIdxOnReplica
在資料庫中新增次要索引。這個預存程序是 CREATE INDEX DDL 陳述式的包裝函式。

參數:

  • idxType - 要建立的索引類型。例如,傳遞 UNIQUE 來建立不重複索引。
  • idxName - 索引名稱。
  • tableName - 資料表名稱,格式為 schema.name。
  • idxDefinition - 索引定義。請勿加入外層括號。
  • idxOption - 傳遞索引建立作業的任何其他選項。舉例來說,在 MySQL 8.0 中,選項可以為隱藏索引傳遞 INVISIBLE。

語法:

mysql.addSecondaryIdxOnReplica(idxType, idxName, tableName, idxDefinition, idxOption)
     
mysql.dropSecondaryIdxOnReplica
會捨棄資料庫上的次要索引。這個預存程序是 DROP INDEX DDL 陳述式的包裝函式。

參數:

  • idxName - 索引名稱。
  • tableName - 資料表名稱,格式為 schema.name。
  • idxOption - 在刪除索引時傳遞的任何其他選項。例如 INPLACE 等演算法選項。

語法:

mysql.dropSecondaryIdxOnReplica(idxName, tableName, idxOption)
      

如需瞭解 idxTypeidxOption 參數,請參閱在 Cloud SQL 執行個體上執行的 MySQL 主要版本說明文件。

範例

正確使用方式

以下列舉幾個例子,說明如何叫用程序。假設我們有一個定義如下的資料表。

CREATE TABLE sampletest.t1(
   id int(10) unsigned NOT NULL AUTO_INCREMENT,
   first_name varchar(64) NOT NULL,
   last_name varchar(64) NOT NULL,
   license_id int NOT NULL,
   PRIMARY KEY (id),
   KEY idx_fname (first_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

如果您想在 first_namelast_name 欄上建立名為 t1_fname_lname 的一般索引,請執行以下操作:

call mysql.addSecondaryIdxOnReplica('', 't1_fname_lname', 'sampletest.t1', 'first_name, last_name', '')

如果您也想在 license_id 欄上建立名為 t1_license_id 的專屬索引,並加上「專屬執照 ID」註解,請執行下列操作:

call mysql.addSecondaryIdxOnReplica('unique', 't1_license_id', 'sampletest.t1', 'license_id', 'comment \"unique license id\"')

如果您想刪除 t1_fname_lname 索引,請執行下列操作:

call mysql.dropSecondaryIdxOnReplica('t1_fname_lname', 'sampletest.t1', '')

使用方式不正確

由於 idxDefinition 參數中含有外層括號,因此下列嘗試在 first_namelast_name 欄建立索引的動作會失敗。

call mysql.addSecondaryIdxOnReplica('', 't1_extra_parenthesis', 'sampletest.t1', '(first_name, last_name)', '')

您只能在客戶建立的資料表上新增索引。以下嘗試在 mysql.servers 資料表的主機欄建立索引時失敗。

call mysql.addSecondaryIdxOnReplica('', 'idx_invalid', 'mysql.servers', 'host', '')

您只能使用 dropSecondaryIdxOnReplica 程序,刪除先前使用 addSecondaryIdxOnReplica 程序建立的索引。舉例來說,下列呼叫會導致現有 idx_fname 索引刪除失敗。

call mysql.dropSecondaryIdxOnReplica('idx_fname', 'sampletest.t1', '')

這些程序呼叫中的 SQL 插入作業會失敗。舉例來說,下列含有註解序列的 SQL 注入會失敗。

call mysql.addSecondaryIdxOnReplica(\"user 'a'@'%' --\", 'idx_fname', 'sampletest.t1', 'first_name', '')

同樣地,這個含有分隔符的 SQL 注入嘗試也會失敗。

call mysql.addSecondaryIdxOnReplica('', 'idx_fname', 'sampletest.t1', 'first_name', ';flush status')

重建唯讀備用資源

有時,當發生問題時,Cloud SQL 會從主要來源重新建立唯讀備用資源,以便快速復原執行個體。在重建作業之前,在讀取/寫入備援機制上建立的索引不會保留。客戶有責任在讀取/寫入備援資料庫上使用已儲存的程序重新建立這些索引。

後續步驟