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.