Para identificar índices redundantes e duplicados, ignorando chaves primárias e estrangeiras e verificando sua cardinalidade. Qual é a prática recomendada para descartar índices em bancos de dados MySQL do AWS RDS no ambiente AWS RDS?
Meu ambiente (contexto): AWS RDS Aurora MySQL 8.0 O objetivo é reduzir custos de armazenamento e melhorar as transações INSERT/UPDATE/DELETE.
TÓPICO 1: Índices duplicados
Sem usar ferramentas adicionais, você poderia usar sys.schema_redundant_indexes
Aqui está o que parece no MySQL 5.7.37:
Os índices sugeridos para queda são
As outras colunas ajudam a explicar por que elas podem ser eliminadas.
Se você quiser se aprofundar nisso, recomendo fortemente que você use a ferramenta pt-duplicate-key-checker . Por que ? Aqui está o que será gerado
Para aqueles que usam MySQL 8.0+
Antes de descartar quaisquer índices duplicados, você deve verificar se suas consultas podem sobreviver sem eles. Por exemplo, se você tiver uma tabela chamada
mydb.mytable
e um índice duplicado chamadoindex99
, poderá ocultar a presença desse índice do otimizador de consulta desta forma:Então, deixe suas dúvidas resolverem. Se o desempenho da consulta for o mesmo, você poderá eliminar o índice:
Caso contrário, mantenha o índice:
NOTA: Esses princípios se aplicam a RDS, Aurora, VMs locais e bare metal.
Diário do Capitão: Suplementar
A diferença entre um índice duplicado e um índice redundante é esta
TÓPICO 2: E quanto à cardinalidade ???
Você pode simplesmente correr
Isso deverá fornecer a cardinalidade de uma única coluna e, em seguida, agrupar por 2 colunas, 3 colunas, etc.
Digamos que você tenha um índice em 3 colunas (a,b,c) em
mydb.mytable
. Você pode obter a cardinalidade das três colunas assim:Isso lhe dará uma ideia de quais tuplas de 3 usariam um índice e quais não. A
cnt
coluna para uma tupla de 3 é superior a 5% da tabela, o índice seria ignorado e você veria uma varredura completa do índice ou uma varredura completa da tabela.