本頁面說明如何在 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)
如需瞭解 idxType
和 idxOption
參數,請參閱在 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_name
和 last_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_name
和 last_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 會從主要來源重新建立唯讀備用資源,以便快速復原執行個體。在重建作業之前,在讀取/寫入備援機制上建立的索引不會保留。客戶有責任在讀取/寫入備援資料庫上使用已儲存的程序重新建立這些索引。