Crie e faça a gestão de índices em réplicas de leitura

Esta página descreve como adicionar e remover índices em réplicas de leitura do Cloud SQL. Embora uma réplica seja normalmente só de leitura, pode haver alturas em que queira criar índices secundários em tabelas para fins de relatórios. O Cloud SQL oferece um conjunto de procedimentos armazenados para gerir estes índices.

Terminologia

  • Índice agrupado. O índice principal numa tabela MySQL que ordena fisicamente as linhas no disco. Quando define uma chave primária numa tabela, o MySQL usa-a como o índice agrupado. Só pode existir um índice agrupado numa tabela.
  • Índice secundário. Um índice adicional numa tabela MySQL que otimiza o desempenho das consultas.

Procedimentos armazenados para índices

O Cloud SQL inclui dois procedimentos armazenados no esquema mysql que pode usar para adicionar e eliminar índices secundários numa réplica de leitura do MySQL. Tenha em atenção que, embora estes procedimentos possam ser executados numa instância de origem principal, foram concebidos para réplicas de leitura.

mysql.addSecondaryIdxOnReplica
Adiciona um índice secundário à base de dados. Este procedimento armazenado é um wrapper para a declaração DDL CREATE INDEX.

Parâmetros:

  • idxType – Tipo de índice a criar. Por exemplo, passe UNIQUE para criar um índice único.
  • idxName – Nome do índice.
  • tableName – Nome da tabela no formato de schema.name.
  • idxDefinition: definição do índice. Não inclua parênteses exteriores.
  • idxOption - Quaisquer opções adicionais a transmitir para a criação do índice. Por exemplo, no MySQL 8.0, uma opção podia transmitir INVISIBLE para um índice invisível.

Sintaxe:

mysql.addSecondaryIdxOnReplica(idxType, idxName, tableName, idxDefinition, idxOption)
     
mysql.dropSecondaryIdxOnReplica
Elimina um índice secundário na base de dados. Este procedimento armazenado é um wrapper para a declaração DDL DROP INDEX.

Parâmetros:

  • idxName – Nome do índice.
  • tableName – Nome da tabela no formato de schema.name.
  • idxOption - Quaisquer opções adicionais a transmitir quando eliminar um índice. Por exemplo, uma opção de algoritmo como INPLACE.

Sintaxe:

mysql.dropSecondaryIdxOnReplica(idxName, tableName, idxOption)
      

Para os parâmetros idxType e idxOption, consulte a documentação da versão principal do MySQL em execução na instância do Cloud SQL.

Exemplos

Utilização correta

Seguem-se alguns exemplos de invocações dos procedimentos. Suponhamos que temos uma tabela com a seguinte definição.

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

Se quiser criar um índice normal denominado t1_fname_lname nas colunas first_name e last_name, execute o seguinte:

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

Se também quisesse criar um índice exclusivo denominado t1_license_id na coluna license_id com o comentário "ID de licença exclusivo", executaria o seguinte:

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

Se, em seguida, quiser eliminar o índice t1_fname_lname, execute o seguinte:

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

Utilização incorreta

A tentativa seguinte de criar um índice nas colunas first_name e last_name falha devido aos parênteses exteriores no parâmetro idxDefinition.

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

Só pode adicionar índices em tabelas criadas pelo cliente. A tentativa seguinte de criar um índice na coluna do anfitrião da tabela mysql.servers falha.

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

Só pode usar o procedimento dropSecondaryIdxOnReplica para eliminar índices criados anteriormente com o procedimento addSecondaryIdxOnReplica. Por exemplo, a seguinte chamada para eliminar o índice idx_fname existente falha.

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

A injeção SQL nestas chamadas de procedimento vai falhar. Por exemplo, a seguinte injeção de SQL com uma sequência de comentários vai falhar.

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

Da mesma forma, esta tentativa de injeção SQL com um delimitador falha.

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

Recriação de réplicas de leitura

Ocasionalmente, quando existe um problema, o Cloud SQL recria uma réplica de leitura a partir da origem principal para recuperar rapidamente a instância. Os índices criados na réplica de leitura antes de uma operação de recriação não são mantidos. É da responsabilidade do cliente recriar estes índices através dos procedimentos armazenados na réplica de leitura.

O que se segue?