Verificando índices duplicados com pt-duplicate-key-checker

Um desafio que enfrentamos como DBAs é diminuir o espaço ocupado pelo banco de dados. A primeira opção costuma ser o expurgo das tabelas, mas, quando isso não é possível, como liberar espaço no datafile?

Enfrentei esse problema em um cliente e, com o auxílio de um utilitário da Percona, consegui contornar a situação.

Como o utilitário funciona: basicamente, o pt-duplicate-key-checker faz uma varredura no catálogo do MySQL em busca de índices duplicados e de índices que podem ser substituídos por outros sem que as queries que os utilizam percam performance.

Após a verificação, podemos remover (drop) esses índices, o que libera espaço e também melhora a performance das operações de escrita, como INSERT, UPDATE e DELETE.

O primeiro passo é instalar o Percona Toolkit no seu s.o:

Após a instalação, devemos seguir com a execução do utilitário para listar os índices e podemos fazer de várias formas.

  • Listar os índices de toda a instância:
pt-duplicate-key-checker –host=localhost –user=root –ask-pass
  • Listar os índices de uma base especifica:
pt-duplicate-key-checker –host=localhost –user=root –ask-pass –databases=nome_da_base
  • Listar os índices de uma tabela especifica:  
pt-duplicate-key-checker –host=localhost –user=root –ask-pass –databases=nome_da_base –tables=nome_da_tabela

Obs: Podemos redirecionar o arquivo utilizando o > (recriar o arquivo do zero) ou >> (sobrescrever) para gerar um arquivo e o Unix não soltar o resultado diretamente na tela.

Após executar os comandos do utilitário, teremos o seguinte resultado:

# ########################################################################
# loja_exemplo.pedidos
# ########################################################################

# Key idx_cliente_id ends with a prefix of the clustered index
# Key definitions:
# KEY idx_cliente_id (cliente_id,id),
# PRIMARY KEY (id),
# Column types:
# cliente_id bigint unsigned not null
# id bigint unsigned not null auto_increment
# To shorten this duplicate clustered index, execute:
ALTER TABLE loja_exemplo.pedidos DROP INDEX idx_cliente_id, ADD INDEX idx_cliente_id (cliente_id);

# ########################################################################
# Summary of indexes
# ########################################################################

# Size Duplicate Indexes 18432
# Total Duplicate Indexes 1
# Total Indexes 42

Primeiro irá aparecer os índices que foram capturados pela ferramenta e a descrição explicando se ele é duplicado ou pode ser substituído por outro, junto do comando para realizar o drop dele.

Em seguida temos um sumário dizendo o tamanho dos índices capturados, o total de índices duplicados e o total de índices.

Após realizar a coleta, o ideal por segurança é deixar os índices invisíveis por um tempo, até que confirme que a query que utilizava o índice anterior não está sofrendo com problemas de performance, porém, isso é possível apenas a partir do MySQL 8.0.

Exemplo:

ALTER TABLE loja_exemplo.pedidos ALTER INDEX idx_cliente_id INVISIBLE;

Quando deixamos o índice invisível a query parte a ignorar ele, como se ele estivesse dropado, porém, ele continua tendo os dados atualizados dentro dele, se mantendo integro. 

Caso haja algum imprevisto relacionado a query que utilizava o índice que ficou invisível, podemos dar rollback e deixa-lo visível novamente.

Exemplo:

ALTER TABLE loja_exemplo.pedidos ALTER INDEX idx_cliente_id VISIBLE;

Após esse comando as Queries voltam a enxergar o índice e passa a ser uma opção de utilização novamente.

Depois de certo tempo em que foi confirmado que não houve nenhum problema, podemos seguir com o drop dos índices. Um ponto importante é a indisponibilidade da tabela enquanto está ocorrendo o drop do índice, logo, o ideal é realizar essa operação ou fora de horário comercial / horário de maior utilização do ambiente.

Porém, caso seja necessário a alteração em horário comercial, ou caso seja uma tabela muito grande onde a alteração vai demorar e ela não pode ficar muito tempo offline, podemos utilizar outro utilitário da Percona para fazer a alteração, o pt-online-schema-change que realiza a alteração sem que a tabela seja bloqueada.

Após o drop dos índices, espaço será liberado e as operações de escrita terão um ganho de performance.

  • Documentação oficial pt-duplicate-key-checket: https://docs.percona.com/percona-toolkit/pt-duplicate-key-checker.html
COMPARTILHE:
Picture of Leonardo Ramos

Leonardo Ramos

DBA MySQL & Sybase At Horus Solutions
Picture of Leonardo Ramos

Leonardo Ramos

DBA MySQL & Sybase At Horus Solutions

PARTICIPE

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *