Criar e gerenciar índices em réplicas de leitura

Nesta página, descrevemos como adicionar e descartar índices de réplicas de leitura do Cloud SQL. Embora uma réplica seja normalmente somente de leitura, pode haver momentos em que você queira criar índices secundários em tabelas para fins de relatórios. O Cloud SQL oferece um conjunto de procedimentos armazenados para gerenciar esses índices.

Terminologia

  • Índice em cluster. O índice principal em uma tabela do MySQL que ordena fisicamente as linhas no disco. Quando você define uma chave primária em uma tabela, o MySQL a usa como o índice em cluster. Só pode haver um índice em cluster em uma tabela.
  • Índice secundário. Um índice adicional em uma tabela do MySQL que otimiza o desempenho da consulta.

Procedimentos armazenados para índices

O Cloud SQL inclui dois procedimentos armazenados no esquema mysql que podem ser usados para adicionar e descartar índices secundários em uma réplica de leitura do MySQL. Embora estes procedimentos possam ser executados em uma instância de origem principal, eles foram projetados para réplicas de leitura.

mysql.addSecondaryIdxOnReplica
Adiciona um índice secundário no banco de dados. Este procedimento armazenado é um wrapper para a instrução DDL CRIAR ÍNDICE.

Parâmetros:

  • idxType: tipo de índice a ser criado. Por exemplo, transmita UNIQUE para criar um índice exclusivo.
  • idxName: nome do índice.
  • tableName: nome da tabela no formato schema.name.
  • idxDefinition: definição do índice. Não inclua parênteses externos.
  • idxOption: qualquer outra opção para transmitir a criação do índice. Por exemplo, no MySQL 8.0, uma opção poderia transmitir INVISIBLE para um índice invisível.

Sintaxe:

mysql.addSecondaryIdxOnReplica(idxType, idxName, tableName, idxDefinition, idxOption)
     
mysql.dropSecondaryIdxOnReplica
Descarta um índice secundário no banco de dados. Este procedimento armazenado é um wrapper para a instrução DDL DESCARTAR ÍNDICE

Parâmetros:

  • idxName: nome do índice.
  • tableName: nome da tabela no formato schema.name.
  • idxOption: qualquer outra opção a ser transmitida ao descartar 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

Uso correto

Veja alguns exemplos de invocações dos procedimentos. Vamos supor 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 você quisesse criar um índice regular chamado t1_fname_lname nas colunas first_name e last_name, você executaria:

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

Se você também quisesse criar um índice exclusivo chamado t1_license_id na coluna license_id com o comentário "ID exclusivo da licença", você executaria:

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

Se você quisesse descartar o índice t1_fname_lname, você executaria:

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

Uso incorreto

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

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

Só é possível adicionar índices em tabelas criadas pelo cliente. A seguinte tentativa de criar um índice na coluna do host da tabela mysql.servers falha.

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

Só é possível usar o procedimento dropSecondaryIdxOnReplica para descartar índices criados anteriormente usando o procedimento addSecondaryIdxOnReplica. Por exemplo, a seguinte chamada para descartar o índice idx_fname existente falha.

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

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

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

Da mesma forma, essa tentativa de injeção de SQL com um delimitador falhará.

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

Recreação de réplicas de leitura

Às vezes, quando há um problema, o Cloud SQL recria uma réplica de leitura na fonte 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. É responsabilidade do cliente recriar esses índices usando os procedimentos armazenados na réplica de leitura.

A seguir